c# – EF6:使用外键关系修改实体属性 – 我是否需要更改Id或相关对象或两者?

我通过修改Id来修改代码中实体的外键属性:

ElementData.ServiceLevelId = parameter.ServiceLevelId;

在持久化之后,我发现当相应的导航属性ServiceLevel意外为空时,这只能按预期工作.如果它仍然保留“旧”对象,则更改将不会命中数据库.

这意味着,我需要这样做

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类的映射以及更多关于如何进行保存的代码,我们可以帮助您进行故障排除.

点赞