【发布时间】:2017-03-23 14:05:48
【问题描述】:
假设我有一个使用 EF 6.0 的产品目录 MVC Web 应用程序,其中所有 CRUD 操作都由存储库处理。现在,其中一个视图必须显示Categories 的List 以及来自Category 的一些关于Products 的聚合信息,我的意思是Category 名称列旁边应该出现三列,总数为该类别的产品,以及产品的最低和最高价格。
public class Product
{
public string Name { get; set; }
public decimal Price { get; set; }
public int CategoryId { get; set; }
public virtual Category Category { get; set; }
}
public class Category
{
public string Name { get; set; }
public virtual ICollection<Product> Products { get; set; }
}
如果我有烘焙产品的存储库
unitOfWork.ProductRepository.Insert(new Product(){Name="Doughnut", Price=4.0, CategoryId=1});
unitOfWork.ProductRepository.Insert(new Product(){Name="Apple Pie", Price=7.0, CategoryId=1});
unitOfWork.ProductRepository.Insert(new Product(){Name="Meat Pie", Price=9.0, CategoryId=1});
我需要显示视图
# Category Total Products Min Price Max Price
1 Bakery products 3 4 9
我不认为从存储库中处理查询是一个好主意,因为它破坏了使用存储库的所有想法,而且 AFAIK 被广泛认为是一种不好的做法。
可以编写一些直接使用DbContext 的查询,但我想知道这种类型的任务在现实世界的应用程序中是如何处理的?
也许需要一个新的视图模型,然后应该添加另一个只读存储库来获取这些数据?像这样?
public class CategoryStatsVM
{
public string Name { get; set; }
public virtual ICollection<Product> Products { get; set; }
public int Count { get; set; }
public decimal MinPrice { get; set; }
public decimal MaxPrice { get; set; }
}
【问题讨论】:
-
您的问题不是由 EF 引起的(
DbContext是 Repository 和 UOW 并且很容易支持此类场景),而是来自您放在上面的其他抽象(限制) ,所以请删除entity-framework标签。 -
@IvanStoev 我正在关注微软的文章docs.microsoft.com/en-us/aspnet/mvc/overview/older-versions/…,它解释了如何在 EF 之上实现 Repository 和 UoW,所以是的,我有一个额外的抽象,但我想了解人们如何处理这些当他们遵循 Microsoft 的文档时遇到问题。
标签: c# asp.net-mvc entity-framework repository