为什么不能使用DbContext.Entry(object).State来更新引用?

时间:2013-04-05 12:52:31

标签: asp.net-mvc-4 entity-framework-4 dbcontext

基于Julie Lerman(http://msdn.microsoft.com/en-us/data/gg715119)的EF Code First教程,我使用类似于以下代码片段的内容来更新MVC 4应用程序中的模型:

public ActionResult Edit(int id, Person person)
{
    using (var db = new MyDbContext())
    {
        person.Address = db.Addresses.Find(312);

        db.Entry(person).State = EntityState.Modified;
        db.SaveChanges();
    }
}

这将保存Person对象的所有标量属性,但不保存对新Address的引用。在调试时,我可以看到我的DbContext知道更新的人。在调用SaveChanges()之后,ChangeTracker的新人具有正确的地址和状态==未更改。但是,下次我查看数据库时,我会看到旧地址而不是新地址......

我做错了吗?这是设计的行为吗?

提前致谢!

澄清:

这个问题的灵感来自一些纯对象数据库(例如db4o和其他)的行为,它是关于DbContext API(或一般的EF)的内部工作原理。

稍微将语句改为:

using (var db = new MyDbContext())
{
    var p = db.Person.Find(person.Id);
    // Variable p is now a person's proxy...

    db.Entry(p).CurrentValues.SetValues(person);
    // The above statement seems unnecessary, but it is actually required...

    p.Address = db.Addresses.Find(312);

    db.SaveChanges();
}

如预期的那样,一切都得到了保存。

令我困惑的是,为什么我们必须在模型中使用外键关联,正如Arnold先生所建议的那样,只是为了能够使用以前的(简单)语法更新对象的引用及其标量属性?在调用db.Entry(person)之后,该人拥有对其他对象的所有正确引用,为什么EF完全忽略它们(与许多对象数据库相比)并且只是在调用SaveChanges()时更新其标量? / p>

0 个答案:

没有答案