Entity framework core 在实体框架7中将导航属性标记为已修改

Entity framework core 在实体框架7中将导航属性标记为已修改,entity-framework-core,Entity Framework Core,我有一个EF7DbContext,它禁用了更改跟踪,因为我想明确标记所有更改: var entry = context.Entry(changedEntity); entry.Property(propertyName).IsModified = true; 这正是我想要的 但是,当引用(导航属性)已更新时,这不起作用 例如,假设我的实体有两个属性-ParentId和Parent,其中ParentId是外键,Parent是对父实体的引用 召唤 entry.Property("Parent").

我有一个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中,没有这样的功能。我可以使用

entry.Metadata.GetNavigation("Parent")
但无法找到任何方法将其标记为已修改

那么,我该怎么做呢

注: 我知道设置
ParentId
会起作用,但这不适合我,因为引用的实体还没有ID,因为它刚刚创建,保存时将从数据库获取其ID。因此,我需要通过引用
Parent
来设置它

编辑:


上面的注释对EF6是正确的,但对我不知道的EF7不再有效。因此,解决方案正如下面的注释和答案所述。

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

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