2010-06-20 71 views
1

我有些糊塗。我不能之所以以下工作:編輯發佈操作 - 爲什麼respository.save()保存數據?

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 }); 
    } 

樣品從斯科特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,但是告訴數據庫使用該ID爲特定記錄提交了更改?我只是看不到它。必須是世界盃...

我只能認爲DataContext對象,db,保留了使用GetDinner方法調用得到的晚餐對象的引用。但是......這一切都感覺有點「神奇」

安德魯

回答

0

你應該看看爲LINQ to SQL類生成的代碼,你會發現類的屬性設置器和獲取器包含了變化跟蹤,以便下一次存儲庫時,生成正確的SQL語句以提交對象所做的任何突變。

0

當你懷疑這是由ORM層處理(這是可以LINQ2SQL或實體框架......不記得它)。 ORM層跟蹤他們正在管理的對象的變化並不罕見,並且由於已從ORM層檢索到已更改的對象(通過db.Dinners.SingleOrDefault()調用,ORM正在跟蹤對該對象的更改,所以它知道它當你調用SubmitChanges時,它已經發生了變化,它是ORM魔法的一部分

+0

很好,但它是如何知道哪個對象用作更新的記錄並進行了更改?顯然,它保持對創建的對象的引用。將看看這些屬性。很明顯,LINQ To SQL比我想象的要多。將不得不深入到這個底部。非常感謝你們兩位。一個人必須得到餅乾,所以會獎勵首先回答的雅各布。 – awrigley 2010-06-20 21:47:11

+0

我不確定Linq2Sql是如何工作的細節,並且您可能或可能無法挖掘代碼以找出答案。如果你感興趣的話,NHibernate還會跟蹤從數據庫中檢索哪些對象,哪些是新創建的,以及這些對象發生的所有更改(並且它使用動態代理)。您可能會發現查看NHibernate源代碼並查看他們解決特定問題的方法是否有趣。 – ckramer 2010-06-20 22:54:10

+0

我正在研究它,是的,datacontext實例跟蹤它在範圍內檢索到的數據。這是我理解中的一個大漏洞,我需要填寫它。只需要弄清楚這些參考文件的工作方式。 – awrigley 2010-06-21 20:06:01

相關問題