代码之家  ›  专栏  ›  技术社区  ›  awrigley

编辑后操作-resposistory.save()为什么保存数据?

  •  1
  • awrigley  · 技术社区  · 15 年前

    我有点困惑。我无法解释为什么以下方法有效:

        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“know”如何保存晚餐对象?

    在我对LinqToSQL的理解中一定有一个漏洞,但如果我能确定它的位置,那就太糟糕了。好的,那么这个dinner对象有一个ID,但是什么告诉db对于这个ID的特定记录有要提交的更改?

    我就是看不见。一定是世界杯…

    我只能认为dataContext对象db保留对使用getdinner方法调用获取的dinner对象的引用。但是…一切都有点“不可思议”

    安得烈

    2 回复  |  直到 15 年前
        1
  •  0
  •   Jacob    15 年前

    您应该查看为LINQ to SQL类生成的代码。您将看到类的属性设置器和getter包含更改跟踪,以便下次保存存储库时,生成适当的SQL语句来提交使对象发生的任何变化。

        2
  •  0
  •   ckramer    15 年前

    正如您怀疑的那样,它是由ORM层处理的(它是Linq2SQL或Entity Framework…不要回忆起哪个)。ORM层跟踪对其管理的对象的更改并不少见,因为已更改的对象是从ORM层(通过 db.Dinners.SingleOrDefault() 调用,ORM正在跟踪对该对象的更改,因此它知道当您调用 SubmitChanges . 这是所有变形金刚魔法的一部分。

    推荐文章