簡體   English   中英

ASP.NET MVC EntityFramework延遲加載還是ViewModel?

[英]ASP.NET MVC EntityFramework lazy loading or ViewModel?

要理解我的意思,最好的例子是ASP.NET MVC上的一個簡單的“MyBlog”。 我有來自表作者帖子評論的數據庫。 如果我需要傳遞一些帖子並顯示它的作者和所有評論 ,那么最佳做法是什么? 使用EntityFramework延遲加載或使用所有necesery數據創建ViewModel

對我來說還有一個問題:如果它是ViewModel ,請將其用於每個視圖,或僅為此創建,需要一些額外的數據? 或者我可能不理解使用ViewModel的想法?

在此先感謝您的部分經驗:)

您應該(幾乎總是)使用不同的ViewModels進行不同的操作(即使ViewModel描述了相同的Entity )。 事實證明,您無需在所有操作中獲取有關Entity所有信息。 假設您的Post實體包含: ICollection<Comment> - 當您的視圖沒有顯示時,您真的需要獲取注釋(或查詢您不需要的字段)嗎?

您還詢問了創建ViewModels的目的是什么 - 這是將數據返回到View的常用和標准方法。 返回適當填充的ViewModel而不是數據庫Entity將阻止Lazy Load異常和錯誤。 即使您的數據庫范圍不正確,您的視圖也可能訪問延遲加載的字段(因為您的數據庫查詢可能沒有加載該字段 - 因為您不需要它)。

使用ViewModel而不是數據模型Entity對象的另一個原因是,有時需要格式化數據庫中的數據以顯示(例如,具有正確日期格式的字符串屬性而不是DateTime - string CreatedDate { get; set; } )。 你當然不希望膨脹你的Entity類。

順便說一下:我建議你看一下AutoMapper庫,它可以幫助你自動從EntityViewModel “復制”屬性,而不是手工完成。

我會告訴你我的“觀點”。 幾乎所有View都使用的ViewModel。 不要懶惰,這樣做。

因此,創建ViewModel,使用您需要的變量填充它,並在Controller中填充變量。

之后,當您開始使用AutoMapper或類似的優勢時,您將理解為什么。

至於你原來的問題:

class PostViewModel
{
    public string Author { get; set; }

    public List<Post> Posts { get; set; }
}

這有幫助還是我需要了解更多細節?

順便說一句,我不使用延遲加載。 我使用它,但99%的時間我調用Include()以確保我有數據。

你應該使用ViewModel來分隔上下文,正如MVC模式所暗示的那樣。 在您的場景中,我可能會使用我計划在各種視圖中使用的所有屬性的總和來創建一個功能齊全的ViewModel,並且只使用DbContext的Entity項中的相應值填充每個特定視圖所需的那些。

這是一個簡短的例子:

public ActionResult Edit(int? id = null) 
{
    Room r = UnitOfWork.GetContext().Rooms
        .Where(i => i.ID == id.Value).FirstOrDefault();
    RoomViewModel rvm = new RoomViewModel();
    rvm.ID = r.ID;
    rvm.Name = rvm.Name;
    if (needToBindChildren) rvm.ChildItems = r.ChildItems;
    return View(rvm);
}

除了使代碼干凈且符合MVC之外,使用ViewModel的另一個優勢是,您可以將它用作最終需要執行的任何請求的主POST參數(基本上,每個View都具有HTML格式 ):

[HttpPost]
public ActionResult Edit(RoomViewModel rvm)
{
    string name = rvm.Name;
    int id = rvm.ID;
    UpdateRoomName(id, name);
}

您可以手動綁定屬性或使用您選擇的映射器(EmitMapper,Ninject,AutoMapper等),具體取決於您的需要。

LazyLoading功能在您的場景中並不真正相關,因為您很可能希望在需要時加載()包含()您的屬性,並在您不需要時避免使用它們。

有關啟用,禁用和有效使用LazyLoading功能的快速參考指南,建議您使用以下參考:

你問的是兩個不同的概念。 實體框架是一個在SQL樣式數據庫上運行的ORM(對象關系映射)層。 ViewModel是一種體系結構概念,它使用包含與當前視圖相關的所有數據和行為的對象。 你真的沒有理由選擇其中一個,這兩個都可能與你正在做的事情有關。

您是從數據庫加載對象嗎? 這些是使用實體框架完成的(通常延遲加載,它實際上不會給你帶來太大的收益,並且可能會花費你更多的數據庫調用)。

當您的數據呈現給用戶時,它應該在視圖模型中。 該模型是傳遞給視圖的模型。 它應該包括與該視圖相關的任何內容(用戶,頁面,相關記錄的數量,可能來自其他來源的一些其他信息),並且通常可以包含來自實體框架的實體的副本。

除非你是做CRUD(創建,檢索,更新,刪除)的意見,有是你的觀點,你的實體之間的脫節,而這種脫節是其中一個視圖模型的用武之地。一個做得好的MVC應用程序實際上是更接近MVVMC(模型視圖VewiModel控制器),其中Controller選擇ViewModel並告訴它需要知道與模型交談並獲取它的數據。 然后將ViewModel傳遞給View。 因此,Controller只不過是您應用程序的路由器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM