从ViewModel访问数据库是否违反MVC原则?

the*_*ist 4 c# asp.net-mvc entity-framework asp.net-mvc-2

我正在使用Entity Framework在MVC2中编写应用程序

据我所知,ViewModel必须只包含数据,而对数据库没有任何逻辑。假设我有Product类,是具有ADO.NET实体EntityCollection<ProductToStatus>时,ProductToStatus是许多一对多表。我有ProductModel(Product它的.ctor)被传递给View。

public class ProductModel
{
    ....
    public Product Item {get; private set;}
    ...
    public ProductModel(Product item)
    {
         ...
         this.Item = item;
         ...
    }
}
Run Code Online (Sandbox Code Playgroud)

在View我需要使产品的所有状态,所以要做到这一点,我需要通过查询数据库item.ProductToStatus.Select(s=>s.ProductStatus).ToList();中ProductModel,但这一请求发送到数据库,因此它违反了MVC的原则?

这样可以吗,还是我需要做点什么?

Sam*_*der 5

你不应该这样做。您的控制器应收集视图所需的数据,并将其打包并将其传递给视图以进行渲染。

因此,您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
    }
Run Code Online (Sandbox Code Playgroud)