我首先使用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属性。
实体框架不应该使用动态代理检测到这种变化吗?
谢谢,
答案 0 :(得分:1)
您观察到的行为是由Entity Framework的关系修正机制引起的,该机制由许多EF方法触发,并且负责外键值和引用(以及其他)的一致性。
关系修正由相当大的number of methods触发,但DbSet.Create()
不是其中之一。所以这就是发生的事情:
var newRecord = context.Records.Create();
创建了一个新的Record
,StatusId
= 0.没有关系修复。
context.Records.Add(newRecord);
新记录附加到上下文。现在EF确实执行了关系修正。如果您监视SQL,您将看到从数据库中获取Status
记录。
newRecord.StatusId = 1;
没有执行EF方法:没有关系修正,Status
对象仍然是Id
= 0的对象。
您现在可以做的是将正确的Status
记录导入newRecord
,或者执行触发关系修正的方法之一,或者调用context.ChangeTracker.DetectChanges()
。