【发布时间】:2015-10-24 16:53:09
【问题描述】:
我有一个禁用更改跟踪的 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。因此,解决方案就像下面的注释和答案中描述的那样。
【问题讨论】: