Model First

本视频和分步演练介绍如何使用实体框架进行 Model First 开发。 Model First 允许你使用实体框架设计器创建新模型,然后从该模型生成数据库架构。 模型存储在 EDMX 文件(.edmx 扩展名)中,可以在实体框架设计器中查看和编辑。 你在应用程序中与之交互的类是从 EDMX 文件自动生成的。

观看视频

本视频和分步演练介绍如何使用实体框架进行 Model First 开发。 Model First 允许你使用实体框架设计器创建新模型,然后从该模型生成数据库架构。 模型存储在 EDMX 文件(.edmx 扩展名)中,可以在实体框架设计器中查看和编辑。 你在应用程序中与之交互的类是从 EDMX 文件自动生成的。

主讲人Rowan Miller

视频WMV | MP4 | WMV (ZIP)

先决条件

需要安装 Visual Studio 2010 或 Visual Studio 2012 才能完成本演练。

如果使用 Visual Studio 2010,还需要安装 NuGet

1. 创建应用程序

为简单起见,我们将生成一个使用 Model First 进行数据访问的基本控制台应用程序:

  • 打开 Visual Studio
  • “文件”->“新建”->“项目…”
  • 从左侧菜单中选择“Windows”并选择“控制台应用程序”
  • 输入 ModelFirstSample 作为名称
  • 选择“确定”

2. 创建模型

我们将使用 Visual Studio 中包含的实体框架设计器来创建模型。

  • “项目”->“添加新项...”

  • 从左侧菜单中选择“数据”,然后选择“ADO.NET 实体数据模型”

  • 输入 BloggingModel 作为名称并单击“确定”,这将启动实体数据模型向导

  • 选择“空模型”并单击“完成”

    Create Empty Model

实体框架设计器以空白模型打开。 现在,我们可以开始向模型添加实体、属性和关联。

  • 右键单击设计图面并选择“属性”

  • 在“属性”窗口中,将“实体容器名称”更改为 BloggingContext。这是将为你生成的派生上下文的名称,该上下文表示与数据库的会话,允许我们查询和保存数据

  • 右键单击设计图面并选择“添加新项”->“实体...”

  • 输入 Blog 作为实体名称,输入 BlogId 作为键名称,然后单击“确定”

    Add Blog Entity

  • 右键单击设计图面上的新实体并选择“添加新项”->“标量属性”,输入 Name 作为属性名称。

  • 重复此过程以添加 URL 属性。

  • 右键单击设计图面上的 URL 属性并选择“属性”,在“属性”窗口中将“可为 null” 设置更改为 True。这样,我们无需为 Blog 分配 URL 即可将其保存到数据库中

  • 使用刚刚学到的方法,添加一个具有 PostId 键属性的 Post 实体

  • 向 Post 实体添加 Title 和 Content 标量属性

我们已经拥有了几个实体,现在可以在它们之间添加关联(或关系)。

  • 右键单击设计图面并选择“添加新项”->“关联...”

  • 使关系的一端指向 Blog,多重性为“一”,另一端指向 Post,多重性为“多”。这意味着一个 Blog 有多个 Post,而一个 Post 属于一个 Blog

  • 确保选中“将外键属性添加到“Post”实体”框,然后单击“确定”

    Add Association MF

我们现在有一个简单的模型,可以从中生成数据库并用于读取和写入数据。

Model Initial

Visual Studio 2010 中的其他步骤

如果使用 Visual Studio 2010,则需要执行一些额外的步骤才能升级到最新版本的实体框架。 升级很重要,因为它使你可以访问最新的 bug 修复,以及改进后的 API 图面,该图面更易于使用。

首先,我们需要从 NuGet 获取最新版本的实体框架。

  • “项目”–>“管理 NuGet 包...”如果没有“管理 NuGet 包...”选项,则应安装最新版本的 NuGet
  • 选择“联机”选项卡
  • 选择 EntityFramework
  • 单击“安装”

接下来,我们需要交换模型,以生成使用 DbContext API 的代码,该 API 是在实体框架的较高版本中引入的。

  • 在 EF 设计器中右键单击模型的空白处,然后选择“添加代码生成项...”

  • 从左侧菜单中选择“联机模板”并搜索“DbContext”

  • 选择“适用于 C# 的 EF 5.x DbContext 生成器”,输入 BloggingModel 作为名称,然后单击“添加”

    DbContext Template

3. 生成数据库

根据我们的模型,实体框架可以计算出一个数据库架构,该架构允许我们使用模型来存储和检索数据。

随 Visual Studio 安装的数据库服务器因你安装的 Visual Studio 版本而异:

  • 如果使用 Visual Studio 2010,你将创建一个 SQL Express 数据库。
  • 如果使用 Visual Studio 2012,你将创建一个 LocalDB 数据库。

接下来,生成数据库。

  • 右键单击设计图面并选择“从模型生成数据库...”

  • 单击“新建连接...”并指定 LocalDB 或 SQL Express(具体取决于你使用的 Visual Studio 版本),输入 ModelFirst.Blogging 作为数据库名称。

    LocalDB Connection MF

    Sql Express Connection MF

  • 选择“确定”,系统会询问你是否要创建新数据库,请选择“是”

  • 选择“下一步”,实体框架设计器将计算脚本以创建数据库架构

  • 显示脚本后,单击“完成”,脚本将添加到项目并打开

  • 右键单击脚本并选择“执行”,系统会提示你指定要连接到的数据库,指定 LocalDB 或 SQL Server Express(具体取决于你使用的 Visual Studio 版本)

4.读取和写入数据

现在我们拥有一个模型,可用它访问某些数据。 我们将用于访问数据的类是根据 EDMX 文件自动生成的。

此屏幕截图来自 Visual Studio 2012,如果你使用的是 Visual Studio 2010,BloggingModel.tt 和 BloggingModel.Context.tt 文件将直接位于项目下,而不是嵌套在 EDMX 文件下

Generated Classes

在 Program.cs 中实现 Main 方法,如下所示。 此代码创建一个新的上下文实例,然后使用它来插入新的 Blog。 接着,它使用 LINQ 查询从数据库中检索按标题字母顺序排序的所有 Blog。

class Program
{
    static void Main(string[] args)
    {
        using (var db = new BloggingContext())
        {
            // Create and save a new Blog
            Console.Write("Enter a name for a new Blog: ");
            var name = Console.ReadLine();

            var blog = new Blog { Name = name };
            db.Blogs.Add(blog);
            db.SaveChanges();

            // Display all Blogs from the database
            var query = from b in db.Blogs
                        orderby b.Name
                        select b;

            Console.WriteLine("All blogs in the database:");
            foreach (var item in query)
            {
                Console.WriteLine(item.Name);
            }

            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
        }
    }
}

现在,可运行应用程序并对其进行测试。

Enter a name for a new Blog: ADO.NET Blog
All blogs in the database:
ADO.NET Blog
Press any key to exit...

5. 处理模型更改

现在可以对模型进行一些更改,当我们进行这些更改时,还需要更新数据库架构。

首先,我们将向模型添加新的 User 实体。

  • 添加一个新的 User 实体名称,将 Username 作为键名,String 作为键的属性类型

    Add User Entity

  • 右键单击设计图面上的 Username 属性并选择“属性”,在“属性”窗口中将 MaxLength 设置更改为 50。这会将可以存储在 username 中的数据限制为 50 个字符

  • 将 DisplayName 标量属性添加到 User 实体

我们现在有一个更新的模型,我们准备更新数据库以适应新的 User 实体类型。

  • 右键单击设计图面并选择“从模型生成数据库...”,实体框架将计算脚本,以根据更新的模型重新创建架构。
  • 单击“完成”
  • 你可能会收到有关覆盖现有 DDL 脚本以及模型的映射和存储部分的警告,对于这两个警告,请单击“是”
  • 系统将为你打开用于创建数据库的已更新 SQL 脚本
    生成的脚本将删除所有现有表,然后从头开始重新创建架构。 这可能适用于本地开发,但无法将更改推送到已部署的数据库。 如果需要将更改发布到已部署的数据库,你需要编辑脚本或使用架构比较工具来计算迁移脚本。
  • 右键单击脚本并选择“执行”,系统会提示你指定要连接到的数据库,指定 LocalDB 或 SQL Server Express(具体取决于你使用的 Visual Studio 版本)

总结

在本演练中,我们研究了 Model First 开发,它允许我们在 EF 设计器中创建模型,然后从该模型生成数据库。 然后,我们使用模型在数据库中读取和写入一些数据。 最后,我们更新了模型,然后重新创建了数据库架构以匹配模型。