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

本文关键字:MVC 原则 ViewModel 访问 数据库 是否 | 更新日期: 2023-09-27 18:16:26

我正在使用实体框架在MVC2中编写应用程序

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

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

View中,我需要呈现产品的所有状态,因此要做到这一点,我需要在ProductModel中通过item.ProductToStatus.Select(s=>s.ProductStatus).ToList();查询DB,但这会向DB发送请求,从而违反MVC原则吗?

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

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

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

所以你的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
    }

是的,它违反了模式。你应该在控制器中填充你的ViewModel,然后把它传递给你的视图。

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