1

我有点糊涂了。我无法解释为什么以下工作:

    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 方法调用获得的晚餐对象的引用。但是......这一切都感觉有点“神奇”

安德鲁

4

2 回答 2

0

正如您怀疑它是由 ORM 层处理的(它是 Linq2SQL 或实体框架......不记得是哪个)。ORM 层跟踪对其正在管理的对象的更改并不少见,并且由于已更改的对象是从 ORM 层检索的(通过db.Dinners.SingleOrDefault()调用,ORM 正在跟踪对该对象的更改,因此它知道它有当你调用时改变了SubmitChanges。这都是 ORM 的魔力的一部分。

于 2010-06-20T17:42:13.227 回答
0

您应该查看为 LINQ to SQL 类生成的代码。您将看到类的属性 setter 和 getter 包含更改跟踪,以便下次保存存储库时,生成正确的 SQL 语句以提交对对象进行的任何更改。

于 2010-06-20T17:42:18.483 回答