我有点糊涂了。我无法解释为什么以下有效:
AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id, FormCollection formValues) {
Dinner dinner = dinnerRepository.GetDinner(id);
UpdateModel(dinner);
dinnerRepository.Save();
return RedirectToAction("Details", new { id = dinner.DinnerID });
}
样本取自Scott Guthrie的NerdDinner演练,其中dinnerRepository.Save()定义为:
public void Save() {
db.SubmitChanges();
}
而dinnerRepository.GetDinner(id)的定义如下:
public Dinner GetDinner(int id) {
return db.Dinners.SingleOrDefault(d => d.DinnerID == id);
}
即db NerdDinnerDataContext如何“知道”保存晚餐对象?
我对Linq To SQL的理解肯定存在漏洞,但如果我能指出它就会受到打击。好的,所以晚餐对象有一个id,但是什么告诉db有哪些更改要为那个Id的特定记录提交?
我只是看不到它。必须是世界杯...
我只能认为DataContext对象db保留了对使用GetDinner方法调用获得的晚餐对象的引用。但是......这一切都感觉有些'神奇'
安德鲁
答案 0 :(得分:0)
你怀疑它是由ORM层处理的(它是Linq2SQL或实体框架......不记得哪一个)。 ORM层跟踪他们正在管理的对象的更改并不常见,并且由于已从ORM层检索已更改的对象(通过db.Dinners.SingleOrDefault()
调用,ORM正在跟踪对该对象的更改,因此当你打电话给SubmitChanges
时,它知道它已经改变了。这都是ORM神奇的一部分。
答案 1 :(得分:0)
您应该查看为LINQ to SQL类生成的代码。您将看到类的属性setter和getter包含更改跟踪,以便下次保存存储库时,会生成正确的SQL语句以提交对象所做的任何突变。