基于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>