编辑发布操作 - 为什么repository.save()会保存数据?

时间:2010-06-20 17:34:45

标签: linq-to-sql asp.net-mvc-2 updatemodel

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

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

安德鲁

2 个答案:

答案 0 :(得分:0)

你怀疑它是由ORM层处理的(它是Linq2SQL或实体框架......不记得哪一个)。 ORM层跟踪他们正在管理的对象的更改并不常见,并且由于已从ORM层检索已更改的对象(通过db.Dinners.SingleOrDefault()调用,ORM正在跟踪对该对象的更改,因此当你打电话给SubmitChanges时,它知道它已经改变了。这都是ORM神奇的一部分。

答案 1 :(得分:0)

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