2011-12-01 127 views
3

我正在使用實體框架在MVC2中編寫應用程序從ViewModel訪問數據庫是否違反了MVC原則?

正如我所知,ViewModel只能包含沒有任何數據庫邏輯的數據。假設我有Product這個類,它是當ProductToStatus是多對多表時有EntityCollection<ProductToStatus>的ADO.NET實體。我有ProductModel(在它的.ctor中需要Product),它傳遞給View

public class ProductModel 
{ 
    .... 
    public Product Item {get; private set;} 
    ... 
    public ProductModel(Product item) 
    { 
     ... 
     this.Item = item; 
     ... 
    } 
} 

View我需要使產品的所有狀態,所以要做到這一點,我需要通過item.ProductToStatus.Select(s=>s.ProductStatus).ToList();ProductModel查詢數據庫,但這發送請求到數據庫,因此做它違反了MVC原則?

這是行嗎?或者我需要做點什麼?

回答

4

你不應該這樣做。您的控制器應該收集您的視圖所需的數據,並將其打包並傳遞給視圖以供呈現。

所以你ProductModel要麼把它在它的構造函數或通過屬性(我的偏好)的需要或者應該在一推,使用Product它被賦予做的所有查詢在構造函數來設置Product的細節它的所有內部字段都沒有保留對Product的引用。我不喜歡在構造函數中使用Product,特別是它在構造函數中做的工作不是很好,但取決於它在做什麼,它可能是確定的。

它可能會更好,讓您ProductModel具有特性的負載,那麼你可以像這樣創建:

var model = new ProductModel() 
    { 
     Statuses=product.ProductToStatus.Select(s=>s.ProductStatus).ToList(), 
     Name=product.Name, 
     OtherProperty=GetPropertyValue(product), 
     //etc 
    } 
1

是其違反了格局。您應該將您的ViewModel填充到Controller中,然後將其傳遞給您的視圖。

當然,它會工作,但那不是模型視圖控制器的想法。

相關問題