2010-04-09 77 views
0

我知道你們都厭倦了這一點的LINQ到SQL問題上的編輯工作時,它加載的LINQ to SQL對象兩次,但我勉強開始使用它(之前從未使用過的ORM)我已經找到了一些「醜陋」的東西。我很習慣ASP.NET Webforms老派開發,但我想把它留在後面並學習新東西(我剛剛開始閱讀ASP.NET MVC書籍和.NET 3.5/4.0)。如何避免網站

所以這裏有一件事我不喜歡,我不能找到一個很好的替代它。

在編輯我已經看到該對象的LINQ對象的大多數示例被加載(擊中分貝)在第一填寫表格頁上的當前值。然後,用戶修改一些字段,當點擊「保存」按鈕時,該對象被第二次加載並更新。

下面是ScottGu NerdDinner網站的簡化示例。

// 
// GET: /Dinners/Edit/5 

[Authorize] 
public ActionResult Edit(int id) { 

    Dinner dinner = dinnerRepository.GetDinner(id); 

    return View(new DinnerFormViewModel(dinner)); 
} 

// 
// POST: /Dinners/Edit/5 

[AcceptVerbs(HttpVerbs.Post), Authorize] 
public ActionResult Edit(int id, FormCollection collection) { 

    Dinner dinner = dinnerRepository.GetDinner(id); 

    UpdateModel(dinner); 

    dinnerRepository.Save(); 

    return RedirectToAction("Details", new { id=dinner.DinnerID }); 
} 

正如您所看到的,每次修改都會加載兩次晚餐對象。除非我錯過了一些有關LINQ to SQL緩存最後查詢的對象的東西,或者類似的東西,我不喜歡兩次獲取它,因爲它只能被檢索一次,然後被修改,然後再重新連接到數據庫。

那麼,我真的錯過了什麼嗎?或者它實際上擊中了兩次數據庫(在上面的示例中它不會造成傷害,但可能會出現一些情況,即獲取一個對象或一組對象可能會很重)。

如果是這樣,您認爲還有什麼方法可以避免雙重加載對象?

太感謝你了, 問候!

回答

1

Web應用程序斷開連接,每個請求都是單獨的。每個MVC控制器方法都是單個Web請求,並且在您顯示的示例中的請求之間不會傳輸任何狀態。沒有辦法知道在初始加載值和提交後編輯值之間是否經過了很多時間。如果其他用戶在初始加載和編輯之間的時間內刪除了晚餐。

狀態數據可以通過使用Cookie和會話等各種選項在Web請求之間傳輸。爲了實現你所描述的內容,你需要將對象存儲在請求範圍之外。這將避免第二次調用「GetDinner」。在ASP.NET MVC中,這是通過使用TempData散列來實現的。您可以將晚餐儲存在那裏,然後從發佈請求中檢索。這意味着數據的副本會臨時存儲在從一個請求到下一個請求的會話中。之後它將從會話中刪除。

0

我不認爲有一種方法來避免這種情況在LINQ to SQL ...你總是需要在更新之前的數據。

在很多情況下可以,因爲與讀取相比,寫入非常少見。如果您發現特定的寫入正在成爲perf問題,那麼您可以始終使用存儲的proc。

0

您可以創建晚餐實體的實例,填寫屬性,然後調用attach(晚餐,真)傳遞實體修改,將在數據庫中更新。
您還可以控制檢查併發問題的一組屬性。
如果您在設計器中將實體的所有屬性設置爲NeverCheck,則可以在更新實體時未執行數據庫查詢時實現這種情況。