[翻译] - <Entity Framework> - 快速入门: 用 EMD 工具在已有数据库的基础上创建一个模型

纯属学习上的记录, 非专业翻译, 如有错误欢迎指正!

原文地址: http://msdn.microsoft.com/en-us/library/gg696166(v=vs.103).aspx

这个快速入门教程将展示怎么时候用 EF 和实体数据模型工具.

其中可以分为以下几部分:

创建名为 "School" 的类库项目.

从数据库生成学校概念模型.

用 DbContext Generator 模板生成对象层代码.

实现数据检索和持久化.

先决条件:

Microsoft Visual Studio 2010 或更新版本.

最新发布的 EF 版本. (可以通过 NuGet中的'Entity Framework' 包获得)

欲了解更多信息, 请参考 Entity Framework Releases and Versioning.

创建名为 "School" 的类库项目

  1. 打开 Visual Studio 2010 或更新版本.

  2. 在 文件 菜单中, 选择 新建, 然后点击 项目.

  3. 在左边的窗格中, 点击 Visual C#, 然后选择 类库 模板.

  4. 输入 SchoolModel 作为项目名称, 并输入 DatabaseFirstSample 作为解决方案名称. 注: 要为项目名称和解决方法名称指定不同的名称, 必须选上位于 新建项目 窗口右下角的 为解决方案创建目录 选项.

从数据库生成概念模型

如果你没有 School 数据库, 请先参考 School Database Schema 教程.

接下来, 你将使用实体模型向导来生成一个 .edmx 文件. 在这个文件中, 将会有: 一个概念模型, 一个存储模型和相关的映射信息. 这个文件为 School 概念模型和数据库定义了一组 1:1 的 实体-表 映射集.

  1. 通过以下步骤添加一个新的 ADO.NET 实体数据模型 项:

    a. 右键点击项目名称, 选择 添加, 然后点击 新建项 选项.

    b. 在 已安装的模板 窗格中选择 数据, 然后选择 ADO.NET 实体数据模型 模板.

    c. 在名称中输入 SchoolModel.edmx.

  这时实体数据模型向导会出现.

  2. 在 选择模型内容 对话框中, 选择 从数据库生成, 然后点击 下一步.

  3. 选择 新建连接. 在 连接属性 对话框中, 在 服务器名称 文本框中输入服务器名 (例如: (localdb)\v11.0). 选择验证方法, 在数据库名文本框中输入 School, 然后点击 确定. 此时 选择您的数据连接 对话框已经根据你的数据库连接设定更新了. 确保 将 App.Config 中的实体连接设置另存为 选项被选中. 然后点击 下一步.

  4. 在 选择数据库对象 对话框中, 通过选择 选项选中所有表.

  5. 选中 确定所生成对象名称的单复数形式在模型中加入外键列 选项.

  该向导将执行下列操作:

  • 添加对 System.Data.Entity, System.Runtime.Serialization, 和 System.Security 程序集的引用.
  • 生成一个 SchoolModel.edmx 文件, 该文件定义了概念模型, 存储模型, 和他们之间的映射. 将 .edmx 文件的 生成操作 属性设置为 嵌入到输出程序集中, 故生成的元数据文件将被嵌入到程序集中.
  • 创建一个包括连接字符串的 App.Config 文件. 对象层的代码将实体类型和上下文(由 System.Data.Entity.DbContextSystem.Data.ObjectContext 引入)定义为公共语言运行库(CLR)中的类型. 在下一步中, 你将用 DbContext Generator 模板代替默认生成对对象层代码.

  6. 编译项目.

用 DbContext 生成器模板生成对象层代码

  EF 工具生成概念模型时, 同时也会生成对象层代码. 默认的, 生成的对象层代码包括以下内容: 继承了 EntityObject 的可多次识别(persistence aware)的实体类型的定义, 和一个继承了 ObjectContext 的上下文类型, 其中包括对应每个模型的类别的 ObjectSet<TEntity> 类型的属性.

在这一节中, 你将使用以下内容代替默认生成的代码: 持久未知的(persistence ignorant)实体类型, 也叫 POCO("plain-old" CLR objects), 和一个继承自 DbContext, 且包含了 DbSet<TEntity> 类型的属性的上下文类型. DbContextDbSet<TEntity> 包含了 ObjectContextObjectSet<TEntity> 类型, 和一个可以执行大多数常见任务的简化 API. 从 EF 4.1 开始, 我们推荐你使用 DbContext API.

  1. 在实体设计器中打开 .edmx 文件.

  2. 在实体设计器的空白区域右击, 然后选择 添加代码生成项.

  在 添加新项 对话框中, 选择 联机模板, 然后在 搜索联机模板 文本框中输入 DbContext Generator.

  为你的模板选择适当的版本 (如果你想使用 EF 5.0 Beta 1 的话则选择 5.0).

  将模板名称改为 SchoolModel, 然后点确定.

  向导将执行以下操作:

    禁用 .edmx 文件中默认的代码生成器, 并将它的 复制到输出目录 属性设置为 不复制.

    创建 SchoolModel.Context.tt 和 SchoolModel.tt 项目文件. 在 SchoolModel.Context.tt 文件下, 有一个定义了继续了 DbContext 的上下文类型的文件. 而在 SchoolModel.tt 文件下, 会有一系列定义了 POCO 实体模型的文件.

  如果你创建的是 Visual Basic 项目, 你可能需要在解决方案资源管理器中选中 显示所有文件 才能看到项目中的所有文件. 

  3. 通过 NuGet 包管理器添加对 EntityFramework 程序集的引用.

  在 项目资源管理器 中, 右击 引用 文件夹, 选择 Manage NuGet Packages... 在 Manage NuGet Packages 对话框中, 选择 EntityFramework 包然后点击 Install.

  注: 如果使用的是预发行版本, 你必须通过 Package Manager Console 操作. 通过以下步骤可以打开该窗口: 在 Visual Studio 的菜单栏中, 选择 工具(Tools) -> Library Package Manager -> Package Manager Console. 在命令窗口中输入以下代码: Install-Package EntityFramework –IncludePreRelease.

  这将会添加最新的 EntityFramework.dll 到你的项目中.

测试 School 模型

在这一节中, 你将会创建一个控制台应用程序来查询和更新 School 模型的实体, 并将数据保存到数据库中.

创建控制台应用项目

  1. 添加一个新的控制台应用程序到 DatabaseFirstSample 解决方案中. 用默认名称就行.

  2. 通过 NuGet 包管理器添加对 EntityFramework 程序集的引用.

  3. 添加对 SchoolModel 类库项目的引用. 在 解决方案资源管理器 中, 右击 引用 文件夹, 选择 添加引用, 在 项目 选项卡中选中 ShoolModel 项目.

  4. 将 SchoolModel 项目中的 App.config 文件复制到这个项目中. .config 文件应该添加到包含可执行程序集的项目中. 现在你可以删除 SchoolModel 项目中的 App.config 文件了.

  5. 将该项目设为启动项目. 通过右击项目然后选择 设为启动项目 可以到达效果.

检索并持久话数据

  1. 用以下代码代替默认生成的 Program 类定义代码:

Program
 1 using SchoolModel;
 2 using System.Data.Entity;
 3 class Program
 4 {
 5     static void Main(string[] args)
 6     {
 7         using (var context = new SchoolEntities())
 8         {
 9             var department = (from d in context.Departments
10                                 where d.Name == "English"
11                                 select d).FirstOrDefault();
12 
13             Console.WriteLine("Courses:");
14             foreach (var c in department.Courses)
15             {
16                 Console.WriteLine("  " + c.Title);
17             }
18 
19             department.Courses.Add(new Course { Title = "Grammar", Credits = 3});
20 
21             // Save new entities.
22             int recordsAffected = context.SaveChanges();
23             Console.WriteLine(
24                 "Saved {0} entities to the database.",
25                 recordsAffected);
26         }
27     }
28 }

  2. 编译并运行应用程序.

posted @ 2012-04-21 12:17  Howll Chen  阅读(1093)  评论(0编辑  收藏  举报