2011-12-01 35 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中,然后将其传递给您的视图。

当然,它会工作,但那不是模型视图控制器的想法。

相关问题