我最近问了一个与此相关的问题并找到了解决方案,但意识到我可能有更大的问题。如果有人可以告诉我是否能够在不更改数据库的情况下执行我在下面描述的操作,将不胜感激! 注意-我是实体框架的新手
我正在尝试在表(Agreement Settings)中插入新协议的重复SettingsId值(与表中一列所示的AgreementId关联)。
但是,SettingsId也存储在具有这些列Algorithm Settings的表中。 Id列代表一个SettingsId,并且是此表的主键。
我只想使用这些新的重复的SettingsId值更新“协议设置”表(上面的前表),而将后一个表保留下来。这样,我将拥有协议,这些协议具有重复的SettingsId指南,但是在“协议设置”表中该指南只有一个唯一的表示形式。
当我尝试使用实体框架插入数据库时:
dataTransferAgreement = (await _dataTransferContext.Agreements
.AddAsync(dataTransferAgreement))
.Entity;
我获得了返回的用于SettingsIds的全新Guid,尽管对象dataTransferAgreement
事先具有重复的Guid作为Properties(它们已被替换)。我认为这是因为Entity Framework在协议设置表中看到了这些外键以及它们与算法设置表的关联(主键),并自动更新了主键,从而自动更新了相关的外键。
我当然不能将算法设置表属性添加到dataTransferAgreement
,因为那样会导致主键冲突。
问题是:是否有任何方法可以手动(或以其他方式)将这些重复的外键值插入“协议设置”表,而无需触摸实体框架中的“算法设置”表(首先编码)?当前,为SettingsId插入主键ID的实体属性用[Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
装饰,该项目在该项目的许多其他地方都使用过,因此我认为我无法更改。
此外,也是在代码中关联此表的实体属性:
[ForeignKey(nameof(SettingsId))]
public AlgorithmSetting AlgorithmSetting { get; set; }
在我的情况下是不需要的(因为我不想对其做任何事情),但是由于它是域模型,所以我不能仅仅删除它(同样,我是Entity Framework新手,所以如果我'无论如何都错了,请纠正我)。
在您的协议设置表中,添加主键“ id”,以及已经拥有的其他两列。实体框架和关系数据库将不支持相同的主键。
如果以后需要查询协议表,则可以使用任何列值进行查询,而只需“忽略”添加的新主键。
很高兴在需要时提供进一步的帮助。