将导航属性标记为在Entity Framework 7中修改

时间:2015-10-23 10:26:45

标签: entity-framework-core

我有一个EF7 DbContext已禁用更改跟踪,因为我想明确标记所有更改:

var entry = context.Entry(changedEntity);
entry.Property(propertyName).IsModified = true;

这完全符合我的要求。

但是,当更新引用(导航属性)时,这不起作用。

例如,假设我的实体有两个属性 - ParentIdParent,其中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。因此,解决方案正如下面的注释和答案中所述。

1 个答案:

答案 0 :(得分:1)

哇,似乎当一个新实体附加到DbContext时,它实际上获得了ID(在我的情况下为-1)。因此,即使目标实体是新的并且尚未添加到数据库中,我也可以设置ParentId

我想知道是否有任何检查新ID是唯一的(数据库中可能已存在ID为-1的条目)。