我是 MVC 和 Entity Framework 的新手,我对执行此操作的正确/首选方法有疑问。
我一直在关注 Nerd Dinner MVC 应用程序,了解我是如何编写这个应用程序的。我有一个页面,其中包含来自几个不同位置的数据。它显示来自几个不同表格的详细信息,还有一个来自查找表的下拉列表。
我创建了一个包含所有这些信息的 ViewModel 类:
class DetailsViewModel {
public List<Foo> DropdownListData { get; set; }
// comes from table 1
public string Property1 { get; set; }
public string Property2 { get; set; }
public Bar SomeBarObject { get; set; } // comes from table 2
}
在 Nerd Dinner 代码中,他们的示例有点过于简单。 DinnerFormViewModel 接受一个实体:Dinner。基于晚餐,它根据晚餐位置为国家/地区创建一个 SelectList。
因为简单,他们的数据访问代码也很简单。他有一个简单的 DinnerRepository,其中包含一个名为 GetDinner() 的方法。在他的 Action 方法中,他可以做一些简单的事情,比如:
Dinner dinner = new Dinner();
// return the view model
return View(new DinnerFormViewModel(dinner));
或
Dinner dinner = repository.GetDinner(id);
return View(new DinnerFormViewModel(dinner));
我的查询比这复杂得多,从多个表中提取...创建一个匿名类型:
var query = from a in ctx.Table1
where a.Id == id
select new { a.Property1, a.Property2, a.Foo, a.Bar };
我的问题如下:
我的存储库类应该是什么样的?存储库类应该返回 ViewModel 本身吗?这似乎不是正确的做事方式,因为 ViewModel 有点暗示它正在 View 中使用。由于我的查询返回一个匿名对象,我如何从我的存储库返回它以便我可以在我的 Controller 操作中构建 ViewModel?
最佳答案
虽然大多数答案都很好,但我认为他们缺少问题的中间行部分。
首先,没有 100% 正确的方法去做,我不会太在意要使用的确切模式的细节。随着您的应用程序得到越来越多的开发,您将开始看到哪些有效,哪些无效,并找出如何最好地改变它以适合您和您的应用程序。我刚刚完全改变了我的 Asp.Net MVC 后端的模式,主要是因为我发现很多建议对我想做的事情没有用。
话虽这么说,但请根据它们应该做什么来查看您的图层。存储库层仅用于从数据源添加/删除/和编辑数据。它不知道这些数据将如何使用,坦率地说,它也不关心。因此,存储库应该只返回您的 EF 实体。
您的问题中其他人似乎遗漏的部分是您需要在 Controller 和存储库之间增加一个层,通常称为服务层或业务层。该层包含由 Controller 调用的各种类(无论您希望如何组织它们)。这些类中的每一个都将调用存储库来检索所需的数据,然后将它们转换为您的 Controller 最终将使用的 View 模型。
此服务/业务层是您的业务逻辑所在的位置(如果您考虑一下,将实体转换为 View 模型就是业务逻辑,因为它定义了您的应用程序实际将如何运行使用该数据)。这意味着您不必调用特定的转换方法或任何东西。这个想法是你告诉你的服务/业务层你想做什么,它给你业务实体( View 模型),而你的 Controller 不知道实际的数据库结构或数据是如何检索的。
服务层也应该是唯一调用存储库类的层。
关于c# - MVC ViewModels 和 Entity Framework 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5079525/