我有一个EF7 DbContext
已禁用更改跟踪,因为我想明确标记所有更改:
var entry = context.Entry(changedEntity);
entry.Property(propertyName).IsModified = true;
这完全符合我的要求。
但是,当更新引用(导航属性)时,这不起作用。
例如,假设我的实体有两个属性 - ParentId
和Parent
,其中ParentId
是外键,Parent
是对此的引用父实体。
调用
entry.Property("Parent").IsModified = true;
不起作用并抛出ModelItemNotFoundException
因为Parent
在EF方面不是实体的属性(而是导航)。
在EF6中,可以按如下方式进行:
var reference = context.Entry(changedEntity).Reference("Parent");
reference.CurrentValue = reference.CurrentValue;
在EF7中,没有这样的功能。我可以使用
访问INavigation
对象
entry.Metadata.GetNavigation("Parent")
但无法看到任何方式将其标记为已修改。
那么,我该怎么做呢?
注意:
我知道设置ParentId
会起作用,但这不适合我,因为引用的实体尚未创建ID,因为它刚刚创建并且在保存时将从数据库中获取其ID。因此,我需要通过引用Parent
设置它。
修改
以上注释适用于EF6,但不再适用于我不知道的EF7。因此,解决方案正如下面的注释和答案中所述。
答案 0 :(得分:1)
哇,似乎当一个新实体附加到DbContext
时,它实际上获得了ID(在我的情况下为-1)。因此,即使目标实体是新的并且尚未添加到数据库中,我也可以设置ParentId
。
我想知道是否有任何检查新ID是唯一的(数据库中可能已存在ID为-1的条目)。