EF6:修改具有外键关系的实体 属性 - 我是否需要更改 Id 或相关对象或两者?
EF6: Modifying an entity property with a foreign key relation - Do I need to change the Id or the related object or both?
我正在修改代码中实体的外键 属性,仅通过修改 Id:
ElementData.ServiceLevelId = parameter.ServiceLevelId;
我发现,在坚持之后,当相应的导航 属性 ServiceLevel
意外地 null
时,这只会按预期工作。如果它仍然持有 "old" 对象,则更改不会影响数据库。
这意味着,我需要做
ElementData.ServiceLevelId = parameter.ServiceLevelId;
ElementData.ServiceLevel = null; //Force the update to the Database
这是否意味着,更改对象 "stronger" 而不是仅更改 ID? 在这种情况下,我是否应该始终将相关对象设置为 null?
更新(根据 Tim Copenhaver 的评论):有问题的实体是现有实体的副本(经过上述修改)。它使用 Automapper 进行复制,并映射除主键和一个无关 属性 之外的所有内容。 Automapper 创建一个浅拷贝 AFAIK。因此,副本的情况是更新的 Id 和未触及的对象引用在将其添加到上下文时不匹配。我猜,EF 然后决定 "object reference is stronger".
只要您的数据映射正确,更改 属性 中的任何一个都可以。 EF 足够聪明,可以看到哪些属性发生了变化并忽略另一个。不过你必须要小心——如果 ElementData.ServiceLevel.Id 不等于 ElementData.ServiceLevelId,你会得到一些模糊的错误。
如果您遇到无法保存的问题,则您的映射层可能不正确。如果您可以 post ElementData 的映射 class 以及有关您如何进行保存的更多代码,我们可以帮助解决问题。
我正在修改代码中实体的外键 属性,仅通过修改 Id:
ElementData.ServiceLevelId = parameter.ServiceLevelId;
我发现,在坚持之后,当相应的导航 属性 ServiceLevel
意外地 null
时,这只会按预期工作。如果它仍然持有 "old" 对象,则更改不会影响数据库。
这意味着,我需要做
ElementData.ServiceLevelId = parameter.ServiceLevelId;
ElementData.ServiceLevel = null; //Force the update to the Database
这是否意味着,更改对象 "stronger" 而不是仅更改 ID? 在这种情况下,我是否应该始终将相关对象设置为 null?
更新(根据 Tim Copenhaver 的评论):有问题的实体是现有实体的副本(经过上述修改)。它使用 Automapper 进行复制,并映射除主键和一个无关 属性 之外的所有内容。 Automapper 创建一个浅拷贝 AFAIK。因此,副本的情况是更新的 Id 和未触及的对象引用在将其添加到上下文时不匹配。我猜,EF 然后决定 "object reference is stronger".
只要您的数据映射正确,更改 属性 中的任何一个都可以。 EF 足够聪明,可以看到哪些属性发生了变化并忽略另一个。不过你必须要小心——如果 ElementData.ServiceLevel.Id 不等于 ElementData.ServiceLevelId,你会得到一些模糊的错误。
如果您遇到无法保存的问题,则您的映射层可能不正确。如果您可以 post ElementData 的映射 class 以及有关您如何进行保存的更多代码,我们可以帮助解决问题。