65.9K
CodeProject 正在变化。 阅读更多。
Home

如何为 MVC 3 使用 Entity Framework Code First

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.90/5 (58投票s)

2011年9月20日

CPOL

6分钟阅读

viewsIcon

230123

downloadIcon

7244

详细讲解如何为 MVC 3 使用 Entity Framework Code First。

引言

你可能会惊讶为什么我会在网上已经有很多相关文章的情况下,还要写一篇关于 MVC EF Code First 的文章!但对于初学者来说,要整合所有这些信息非常困难。同时,我也会尝试发布一系列循序渐进的文章。现在,让我们从介绍开始。

推荐先决条件

  • Visual Studio 2010 SP1
  • SQL Express
  • ASP.NET MVC 3 (如果你已经正确安装了 Visual Studio 2010 SP1,它已经包含在内了,否则你可以在这里找到它)。

引言

Microsoft 的 ADO.NET Entity Framework (EF) 简化了数据访问,避免了在代码中直接操作数据库。Entity Framework 负责所有的数据库交互。由于它直接在内存中操作你的对象,因此无需编写额外的代码来处理实体之间的任何连接。

Visual Studio 2010 提供了更丰富的 EF 设计和工具支持。VS 2010 中的 EF 设计器支持两种开发风格:“数据库优先”开发风格——即根据现有数据库在设计界面上构建你的模型层,以及“模型优先”开发风格——即首先使用设计界面定义你的模型层,然后用它来生成数据库架构。

Code First

EF4 还支持一种更偏向代码的选项,我们称之为“Code First 开发”。在使用 Code First 开发时,你将从编写 .NET 类开始,这些类定义了你的概念(领域)模型。然后,你可以使用你的模型来生成数据库架构,或者映射到现有数据库。

由于你做的第一件事就是编写代码来描述你的实体,你可以简单地定义类,然后让 EF 来处理它们,因此这被称为“Code First 开发”。Code First 具有以下优点:

  • 开发时无需打开设计器或定义 XML 映射文件
  • 只需编写“纯旧类”(Plain Old Classes),无需继承任何基类即可定义模型对象
  • 采用“约定优于配置”的方法,无需显式配置任何内容即可实现数据库持久化
  • 可选地覆盖基于约定的持久化,并使用 Fluent 代码 API 完全自定义持久化映射

MVC(模型-视图-控制器)的微小基础知识

模型

  • 业务逻辑
  • 可以使用以下任何一种
    • LINQ to SQL
    • 实体框架
    • nHibernate
    • 以及更多..

视图

  • 无业务逻辑,仅显示逻辑
  • JavaScript-jQuery 用于客户端验证

控制器 (Controller)

  • 包含 Action
  • 充当请求网关
  • 决策者(决定需要哪些数据,渲染哪个模型,以及渲染哪个视图)

如果你查看上图,你会发现有ModelsViewsControllers文件夹。我稍后会详细讨论它们。这里我只给你一个介绍。

创建一个 MVC 3 应用程序

  1. 在你的 Visual Studio 2010 中,转到 文件 -> 新建 -> 项目。
  2. 在 Visual C# -> Web 部分,你会看到一个创建“ASP.NET MVC 3”应用程序的选项,选择它,设置其他偏好设置(项目名称、项目目录),然后点击确定。
  3. 请记住,不要选择“文件 -> 新建 -> 网站”选项。

    step1.JPG

  4. 在下一个 ASP.NET MVC 3 项目向导中,选择“Internet 应用程序”,并将“Razor”作为视图引擎。
  5. step2.JPG

Visual Studio 会自动为你创建一个完整的项目结构,包括包含预建控制器类、模型、视图以及用于 jQuery、JavaScript 和 CSS 文件的“Scripts”、“Content”的文件夹。

如果你现在运行你的项目,你会发现默认内容,它只是一个欢迎你使用 MVC 的消息和一个包含主页/关于/登录/注册页面的基本布局。

你可以更改欢迎消息。如果你打开“Views/Home/Index.cshtml”(Razor 视图),你会看到 @ViewBag.Message。由于 @ViewBag 指向一个动态类型的集合,因此可以将任何类型的元素分配给它。如果你打开“Controllers/HomeController.cs”,你会发现

public ActionResult Index()
{
    ViewBag.Message = "Welcome to ASP.NET MVC!";
    return View();
}

ViewBag.Message 设置为Hello World! 而不是Welcome to ASP.NET MVC!

此时你应该了解一些事情

  • 基于 Razor 的视图的扩展名是.cshtml(用于使用 C# 的视图)和.vbhtml(用于使用 VB.NET 的视图)。
  • 无法通过直接请求显示的(母版页、部分视图等)文件名以“_”(下划线)开头。

现在构建并运行你的应用程序。这是你在 MVC 3 中的第一个 Hello World。

Entity Framework Code First

你无需创建数据库或指定架构即可开始应用程序。你可以从编写定义领域模型对象的类开始,这对于我们的应用程序来说是最合适的——无需处理数据持久化逻辑的混杂。

创建一个模型类,例如“Author”,它将创建一个空类。

step5.JPG

step6.JPG

写入以下代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;

namespace OpenLibrary.Models
{
    public class Author
    {
        public int AuthorId { get; set; }
        [Required] //Anotation
        public string Name { get; set; }
        public string Address1 { get; set; }
        public string Email { get; set; }
        public string Phone { get; set; }
        public DateTime DOB { get; set; }

        public virtual ICollection<book> Books { get; set; }
        // Author have collect of Books
    }
    public class Book 
    {
        public int BookId { get; set; }
        public string Name { get; set; }
        public DateTime PublishDate { get; set; }
        // Ref. for the Author . It helps to relate the two class
        // and also helps to create the EF Code First data Base
        public int AuthorId { get; set; } 

        public virtual Author Author{get;set;} //virtual property to access Author

    }
}

这只是代码。并非来自数据库。请注意,我已将 [Required] 注解添加到此类的属性上。Required 注解告诉 EF 特定属性是必需的。将 Required 添加到 Name 属性将强制 EF 和 MVC 确保该属性包含数据。我稍后会讨论 Code First DataAnnotations。

接下来,通过右键单击 -> 添加控制器来创建一个 Author Controller。

  • 定义控制器名称
  • 模板 [包含读/写操作和视图的控制器,使用 Entity Framework]
  • 模型类 [Author(OpenLibrary.Models)]
  • 数据上下文类 [单击新的数据上下文,将出现另一个模态窗口,点击确定,然后点击添加]
  • 接下来,通过右键单击 -> 添加控制器来创建一个 Book Controller。

  • 定义控制器名称
  • 模板 [包含读/写操作和视图的控制器,使用 Entity Framework]
  • 模型类 [Book(OpenLibrary.Models)]
  • 数据上下文类 [使用相同的数据上下文并点击添加]

step8.JPG

step9.JPG

查看解决方案资源管理器,你会找到自动生成的代码。上下文类保存了 EF 的 Authors 和 Books。你可以从控制器访问该类以及所有生成的类。你还可以访问 Razor 中所有自动生成的 Create、Delete、Details、Edit 和 Index 视图。如果你打开 Controllers,你也会找到这些方法。所以,你已经从创建的模型中获得了自动生成的视图和控制器。

step10.JPG

接下来打开 Models/OpenLibraryContext.cs,你会发现 DBContextDBSet 在那里。

当你运行应用程序时,DBContext 会检查是否有派生上下文类型的模型以及应用程序域中是否已缓存任何连接字符串。如果已存在,则使用该模型;否则,DBContext 根据已定义的 DbSet 属性来确定要在模型中包含哪些类。然后,它使用默认的 Code First 约定和通过注解或 Fluent API 指定的附加配置来构建模型。当创建派生的 DbContext 类实例时,System.Data.Entity.DbSet 属性会自动初始化。

现在运行项目,享受 CRUD 操作吧。

  • 在 URL 区域输入 Author,你会看到一个空的 Author 列表页面。
  • 点击“Create New”(新建),填写数据并保存。
  • 你也可以编辑、删除,还可以查看每个 Author 的详细信息。
  • 在 URL 区域输入 Book 并点击“Create New”(新建)。
  • 你会在 Book/Create 页面上看到一个 Author 下拉列表。选择并保存书籍的详细信息。

优点与缺点

优点

  • 我希望你已经明白了(内容庞大)。

缺点

  • 将实体映射到数据库是相当复杂的。
  • 没有模型图。

这是一个介绍性的,非常基础的例子,但我很喜欢。它只需几分钟就能完成大量工作,而且代码量和精力投入很少。希望你喜欢这个。祝你玩得开心!

© . All rights reserved.