【问题标题】:Marking navigation property as modified in Entity Framework 7在 Entity Framework 7 中将导航属性标记为已修改
【发布时间】:2015-10-24 16:53:09
【问题描述】:

我有一个禁用更改跟踪的 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。因此,解决方案就像下面的注释和答案中描述的那样。

【问题讨论】:

    标签: entity-framework-core


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 2015-03-29
      • 1970-01-01
      • 2014-12-21
      • 1970-01-01
      相关资源
      最近更新 更多