我们如何在ASP.Net MVC应用程序中使用EF创建3层架构?

4

我正在使用ASP.NET MVC 5和Entity framework 6创建一个新的项目(网络应用程序)。在ASP.Net web表单应用中,我曾经使用过3层架构,但是我对处理entity framework、models等方面感到困惑。

那么,在MVC中如何构建3层架构,并且是否可以使用entity framework?


MVC自然包含3个层,它们是模型(Model)、视图(View)和控制器(Controller),EF是一种ORM,位于DB和C#代码之间,并提供数据操作或数据访问翻译,与架构无关。模型是MVC架构中的一层,但EF与其无关。 - Transcendent
我稍后会回来回答这个问题,我正在做一个类似的小项目。 - carloswm85
3个回答

6

你可以实现一个三层或类似的架构。

ASP.NET MVC与Entity Framework有很好的配合。甚至在默认的ASP.NET MVC模板中,EF被安装并用于用户/角色管理(身份验证)。

典型的ASP.NET MVC应用程序由模型、视图和控制器组成。简要地说:

  • 模型是POCOs。该模型封装数据,并负责数据的有效性。类比于应用程序层和数据层的一部分。数据层还包括EF数据库上下文类。
  • 视图是.cshtml文件,可以生成html,并且可以强类型化(具有模型)。类比于表示层。
  • 控制器负责处理HTTP请求,检索数据模型并将模型传递给视图。类比于应用程序层(业务逻辑)的一部分。

通常,控制器会接收一些viewModel,对其进行验证、处理,并返回某些操作结果(视图、部分视图、JSON、文件等)。在处理过程中,控制器可以初始化Entity Framework上下文,并通过EF数据库上下文获取或保存数据等。

“尽可能保持控制器尽可能薄”几乎总是一个好主意,因此许多ASP.NET MVC解决方案使用存储库/工作单元或服务模式。

以下是使用服务创建一些实体的MVC应用程序的典型部分示例:

服务

// Connect to database through entity framework db context.
public interface IMyService
{
    MyDbContext DbContext { get; set; }

    IQueryable<Something> GetSomething( ... query params ... );
    void CreateSomething(Something model);
    // etc. 
}

控制器

public MyController
{
    private IMyService myService;

    public MyController(IMyService myService)
    {
        this.myService = myService;
    }

    // Showing create/edit form
    [HttpGet]
    public ActionResult CreateSomething()
    {
        // Create Empty view model. new SomeViewModel(); for example.
        // Get some nomenclatures for dropdowns etc. through the service (if needed).
        // return View(viewModel);
    }

    // Processing the post request
    [HttpPost]
    public ActionResult CreateSomething(SomeViewModel viewModel)
    {
        // Check validity of viewModel (ModelState.IsValid)
        // If not valid return View(viewModel) for showing validation errors
        // If valid map the viewModel to Model (through AutoMapper or custom mapping)
        // Call myService CreateSomething method.
        // Redirect to page with details.
    }
}

模型

public class Something
{
    public int Id { get; set; }
    public string Name { get; set; }
    // .. more properties (can be decorated with validation attributes)
}

演示文稿视图模型

// View model for Something class. Including only properties related to the current UI.

public class SomeViewModel
{
    public int Id { get; set; }
    // .. more properties (can be decorated with validation attributes)
}

视图

@model SomeViewModel

<!-- Form -->

@Html.ValidationForModel()
@Html.EditorForModel()
submit button

<!-- /Form -->

根据您的文章,我不需要创建三层架构,MVC和EF的组合本身就成为了一个三/ N层架构。对吗? - Mitesh Antala
MVC和EF的组合本身就变得非常类似于3层架构,但并不完全相同(在传统意义上的3层架构)。我建议使用所描述的架构,但我无法确定您需要这种架构还是传统意义上的3层架构。 - Viktor Bahtev

1

是的,您可以实现3层架构:

  1. 层(表示层):视图(这就是MVC中V的含义)
  2. 层(逻辑层):通常是模型和一些帮助类(这就是M的含义)
  3. 层(数据层):借助Entity Framework的帮助,您可以从模型创建数据库。

这里有一个关于如何在ASP.NET MVC中使用Entity Framework的教程。


0

这是一个不错的答案,提供的链接看起来也非常好。但是这个答案还需要改进。 - carloswm85

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接