从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原则吗?
这样可以吗?还是我需要做点什么?
你不应该这样做。您的控制器应该收集视图所需的数据,并将其打包并传递给视图以供其呈现。
所以你的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,然后把它传递给你的视图。
它当然会工作,但这不是模型-视图-控制器的想法。