我在代码中修改实体的外键属性,仅通过修改 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 然后决定“对象引用更强”。
最佳答案
只要您的数据映射正确,更改任一属性都可以。 EF 足够聪明,可以看到哪些属性发生了变化并忽略另一个。不过,您必须小心 - 如果 ElementData.ServiceLevel.Id 不等于 ElementData.ServiceLevelId,您将收到一些模糊的错误。
如果您在保存时遇到问题,您的映射层可能不正确。如果您可以发布 ElementData 类的映射以及有关您如何进行保存的更多代码,我们可以帮助解决问题。
关于c# - EF6 : Modifying an entity property with a foreign key relation - Do I need to change the Id or the related object or both?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34656895/