c# - MVC ViewModels 和 Entity Framework 查询

标签 c# asp.net-mvc entity-framework repository-pattern viewmodel

我是 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/

相关文章:

c# - Entityframework 4.0 .CreateQuery<T> 和 OrderBy 异常

c# - 我有一个 POCO,我可以从 DbContext 获得代理吗?

c# - 子/父事件引发

c# - _userManager.GetUserAsync(User) 返回 null

asp.net-mvc - 如何从 MVC 5 应用程序发送电子邮件

entity-framework - EF6 代码首先复数表无效的对象名称

c# - 更新到 Lucene.net 4.8.0-beta00001 后代码中断

c# - 如何使用 Crystal Report Visual Studio 2013 在条形图中添加 2 个系列

c# - 部分 View 中的按钮在搜索后停止工作

html - 如何将另一个目录中的 html 文件作为 ActionResult