Asp.net mvc 4 为什么不能使用DbContext.Entry(object.State)更新引用?

Asp.net mvc 4 为什么不能使用DbContext.Entry(object.State)更新引用?,asp.net-mvc-4,entity-framework-4,dbcontext,Asp.net Mvc 4,Entity Framework 4,Dbcontext,基于Julie Lerman的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 = Entity

基于Julie Lerman的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();
    }
}
这将保存MyPerson对象的所有标量属性,但不会保存对新地址的引用。在调试时,我可以看到我的DbContext知道更新的人。调用SaveChanges后,ChangeTracker会让具有正确地址和State==Unchanged的新人加入。但是,下次我查看数据库时,我看到的是旧地址而不是新地址

我做错什么了吗?这种行为是故意的吗

提前谢谢

澄清:

这个问题是受一些纯对象数据库(如db4o和其他数据库)的行为启发而提出的,它一般是关于dbcontextapi或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.Entryperson(此人对其他对象的引用都是正确的)之后,为什么EF会完全忽略它们而不是许多对象数据库,而只是在调用SaveChanges时更新其标量?

这就是为什么它如此有用:您可以设置一个基元属性。感谢您的提示。但是使用fka需要修改我的模型以包含地址外键,这意味着与数据库更紧密地耦合,并将关系概念引入到对象模型中。。。这不是违背了ORMs的目的吗?ORMs总是在域中留下足迹。如果您使用它们,请以最适合它们的方式进行操作,对于EF来说,就是使用FKAs。