EF6:修改具有外键关系的实体属性-我需要更改Id或相关对象吗

本文关键字:Id 对象 修改 属性 实体 关系 EF6 | 更新日期: 2023-09-27 18:29:31

我正在修改代码中实体的外键属性,只修改Id:

ElementData.ServiceLevelId = parameter.ServiceLevelId;

我发现,在坚持之后,只有当相应的导航属性ServiceLevel意外地为null时,这才像预期的那样工作。如果它仍然保留"旧"对象,则更改不会影响数据库。

这意味着,我需要做

ElementData.ServiceLevelId = parameter.ServiceLevelId;
ElementData.ServiceLevel = null; //Force the update to the Database

这是否意味着,更改对象比只更改id"更强"在这种情况下,我是否应该始终将相关对象设置为null?

更新(根据Tim Copenhaver的评论):有问题的实体是现有实体的副本(经过上述修改)。它使用Automapper进行复制,并映射除主键和一个无关属性之外的所有内容。Automapper创建一个浅拷贝AFAIK。因此,副本的情况是,在将其添加到上下文的那一刻,更新的Id和未修改的对象引用将不匹配。我想,EF会决定"对象引用更强"。

EF6:修改具有外键关系的实体属性-我需要更改Id或相关对象吗

只要数据映射正确,更改任何一个属性都有效。EF足够聪明,可以看到哪些属性发生了变化,而忽略另一个。不过,你必须小心——如果ElementData.ServiceLevel.Id不等于ElementData.ServicesLevelId,你会得到一些模糊的错误。

如果您在不保存时遇到问题,则映射层可能不正确。如果您可以发布ElementData类的映射以及有关如何进行保存的更多代码,我们可以帮助进行故障排除。