实体框架导航属性更新

时间:2014-10-29 13:09:33

标签: entity-framework change-tracking

我首先使用SQLite和代码使用Entity Framework 6。 我对象的更新有问题。

我有一个"记录"对象

class Record {

  public long Id;
  public long StatusId

  public virtual Statut Status;
}

所以"状态"对象

我创建了一个像这样的Record对象

var newRecord = context.Records.Create();

虽然我没有在上下文中添加它,但Status属性为null。

context.Records.Add(newRecord);

现在,我在Status导航属性中有一个Status对象(状态对象的id = 0)。

但是,如果我将StatusId更改为1(例如,此状态ID存在),则不会更新Status属性。

实体框架不应该使用动态代理检测到这种变化吗?

谢谢,

1 个答案:

答案 0 :(得分:1)

您观察到的行为是由Entity Framework的关系修正机制引起的,该机制由许多EF方法触发,并且负责外键值和引用(以及其他)的一致性。

关系修正由相当大的number of methods触发,但DbSet.Create()不是其中之一。所以这就是发生的事情:

var newRecord = context.Records.Create();

创建了一个新的RecordStatusId = 0.没有关系修复。

context.Records.Add(newRecord);

新记录附加到上下文。现在EF确实执行了关系修正。如果您监视SQL,您将看到从数据库中获取Status记录。

newRecord.StatusId = 1;

没有执行EF方法:没有关系修正,Status对象仍然是Id = 0的对象。

您现在可以做的是将正确的Status记录导入newRecord,或者执行触发关系修正的方法之一,或者调用context.ChangeTracker.DetectChanges()