《Entity Framework 6 Recipes》翻译系列 (3) -----第二章 实体数据建模基础之创建一个简单的模型

时间:2021-08-27 23:50:31

第二章 实体数据建模基础

  很有可能,你才开始探索实体框架,你可能会问“我们怎么开始?”,如果你真是这样的话,那么本章就是一个很好的开始。如果不是,你已经建模,并在实体分裂和继承方面感觉良好,那么你可以跳过本章。

  本章将带你漫游使用实体框架建模的基本实例,建模是实体框架的核心特性,同时也是区别实体框架和微软早期的数据访问平台的特性。一旦建好模,你就可以面向模型编写代码,而不用面向关系数据库中的行和列。

  本章以创建一个简单概念模型的实例开始,然后让实体框架创建底层的数据库,剩下的实例,将向你展示,如何通过数据库中已存在的表以及它们之间的关系来建模。

2-1 创建一个简单模型

  问题

  你有一个崭新的项目,需要创建一个模型。

  解决方案

  我们设想你需要创建一个管理,人员姓名、电话号码的应用程序。为了保持尽可能的简单,我们假设你只需要一个实体类型:Person。

    按以下步骤来创建模型:

      1.右键你的项目,然后选择➤New Item(新建项)。

      2.从模板中选择 ADO.NET Entity Data Model(ADO.NET实体数据模型),然后点击Add(增加)。该模板在Visual C#条目下面的Data项下面。(如图2-1)。

《Entity Framework 6 Recipes》翻译系列 (3) -----第二章 实体数据建模基础之创建一个简单的模型

图2-1 增加一个新的.emdx文件,其中包含使用XML描述的概念模型、存储模型、映射层

      3.在向导第一步选择Empty Model(空模型)并点击Finish(完成)按钮。向导将创建一个新的设计器界面上为空的概念模型。

      4.右键设计器界面,选择增加➤Entity(实体)。

      5.在Entity Name(实体名称)字段键入Person,选中Create a Key Propety(创建实体键)复选框,使用Id作为实体键并确保其类型为Int32.点击OK按钮,一个新的Person实体便出现在设计器窗口中(如图2-2)。

《Entity Framework 6 Recipes》翻译系列 (3) -----第二章 实体数据建模基础之创建一个简单的模型

图2-2在概念模型中添加一个代表Person的实体类

      6.右键Person实体顶部,然后选择Add(添加) ➤Scalar Property(标量属性)。一个新的标量属性便添加到了Person实体中。

      7.将增加的标量属性重命名为Firstname.然后继续添加标量属性LastName、MiddleName和PhoneNumber.

      8.右键Id属性并选择Properties(属性),在属性窗口中,如果StoreGneneratedPattern属性值未设置为Identity时,将其设置为Identity。该标识是指Id属性的值将由存储层(数据库)计算产生。最终得到的数据库脚本会标识Id列为identity列,存储逻辑模型也会知道,数据库将会自动管理该列的值。

    完成后的概念模型如图2-3所示。

《Entity Framework 6 Recipes》翻译系列 (3) -----第二章 实体数据建模基础之创建一个简单的模型

图2-3 模型包含一个代表Person的实体类型

    你已经完成了一个简单的概念模型。不过从该模型生成数据库,还有一些工作要做:

      9.需要更改我们模型的一些属性,以帮助我们生成数据库。右键计设器窗口,选择properties(属性)。更改数据库架构名称(Database Schema name)为Chapter2,更改实体容器名称(Entity Container Name)为EF6RecipesContext。如图2-4所示。

《Entity Framework 6 Recipes》翻译系列 (3) -----第二章 实体数据建模基础之创建一个简单的模型

图2-4 更改模型属性

      10.右键设计器窗口并选择Generate Database Script from Model(根据模型生成数据库)。选择一个已存在的数据库连接或者新建一个连接。图2-5,我们选择创建一个新的本地数据库EF6Recipes的连接。

《Entity Framework 6 Recipes》翻译系列 (3) -----第二章 实体数据建模基础之创建一个简单的模型

图2-5创建一个实体框架从概念模型创建数据库脚本要使用的数据库连接

      11.单击OK按钮完成连接属性设置,然后单击Next(下一步)预览数据库脚本(如图2-6)。一旦点击Finish(完成),生成的脚本就被添加到你的项目中。

《Entity Framework 6 Recipes》翻译系列 (3) -----第二章 实体数据建模基础之创建一个简单的模型

图2-6 在.edmx文件中生成存储逻辑模型并创建数据库脚本

      12.在SSMS(SQL Server Management Studio)查询窗口中执行上面生成的数据库脚本创建数据库和People表。

 原理

  实体框架设计器是一个创建概念模型、存储模型和映射层的强有力工具。它提供双向建模的功能,你可以从一个空白的模型设计窗口建模,也可通过导入一个已存在的数据库来创建概念模型、存储模型和映射层。当前版本提供了有限的双向建模功能,它允许从模型重新创建数据库,根据数据库的改变来更新模型。

  概念模型拥有很多影响生成存储逻辑模型和数据库脚本的属性,我们更改了其中的两个属性,第一个是容器的名称,他是继承至DbContext上下文对象。我们给它命名为EF6RecipesContext,它与本书使用的上下文对象保持一致。

  另一个是,更改了表示生成存储逻辑模型和数据库脚本的架构名称为“Chaper2”。

  代码清单2-1演示了,我们创建和插入Person实体类型的实例,并将所有Person实体保存到数据库。

代码清单2-1. 从模型中插入和获取数据

             using (var context = new EF6RecipesContext()) {
var person = new Person {
FirstName = "Robert",
MiddleName = "Allen",
LastName = "Doe",
PhoneNumber = "867-5309"
};
context.People.Add(person);
person = new Person {
FirstName = "John",
MiddleName = "K.",
LastName = "Smith",
PhoneNumber = "824-3031"
};
context.People.Add(person);
person = new Person {
FirstName = "Billy",
MiddleName = "Albert",
LastName = "Minor",
PhoneNumber = "907-2212"
};
context.People.Add(person);
person = new Person {
FirstName = "Kathy",
MiddleName = "Anne",
LastName = "Ryan",
PhoneNumber = "722-0038"
};
context.People.Add(person);
context.SaveChanges();
}
using (var context = new EF6RecipesContext()) {
foreach (var person in context.People) {
System.Console.WriteLine("{0} {1} {2}, Phone: {3}",
person.FirstName, person.MiddleName,
person.LastName, person.PhoneNumber);
}
}

代码清单2-1的输出为:

John K. Smith,         Phone: 824-3031
Robert Allen Doe,     Phone: 867-5309
Kathy Anne Ryan,            Phone: 722-0038
Billy Albert Minor,            Phone: 907-2212

最佳实践
  当创建一个上下文实例时,我们使用using()语句:

  using (var context = new EF6RecipesContext())
  {
    ...
  }

  如果你不熟悉这种模式,也没关系,因为它很简单。一般情况下,我们通过new操作符并将结果赋值给变量来得到一个对象的实例,当这个变量超出其生命周期,该对象不再被别的任何对象引用。垃圾回收器会在某一个时间点开始释放该对象所占的内存工作。 对于我们.NET应用程序中的大多数对象来说,这是一个巨大的工作,因为他们会一直占用着资源,直到垃圾回收器开始工作。而垃圾回收器具有不确定性,因为他总是按自己的计划来完成其工作,对此我能施加的影响很有限。

  DbContext上下文对象的实例占用着像数据库连接这样的,我们希望不使用时就立即释放的系统资源。我们真的不希望数据库连接的释放工作要等到垃圾回收器来完成。

  using()语句有很好的特性。首先,当代码执行完using(){}代码块时,上下文中的Dispose()方法会被自动调用。因为DbContext上下文实现了IDisposable接口,该方法将关闭所有数据库连接,清理任何需要被释放的资源。

  其次,不管怎样,只要代码离开using(){}代码块,方法Dispose()就会被调用。最重要的是,代码块里即使遇到return语句或者是抛出了异常,它都能保证资源得到合理的释放。

  这里的最佳实践是,当创建DbContext上下文对象时总是使用using(){}代码块,它将进一步帮助你创建健壮的代码。

  本篇就到这里吧,如果有翻译不当的地方,恳请指正。如果你觉得本系值得与更多人分享,那么请点击右下角的推荐谢谢。本文由VolcanoCloud翻译,转载请注明出处。谢谢!

实体框架交流QQ群:  458326058,欢迎有兴趣的朋友加入一起交流

谢谢大家的持续关注,我的博客地址:http://www.cnblogs.com/VolcanoCloud/

《Entity Framework 6 Recipes》翻译系列 (3) -----第二章 实体数据建模基础之创建一个简单的模型的更多相关文章

  1. 《Entity Framework 6 Recipes》中文翻译系列 (9) -----第二章 实体数据建模基础之继承关系映射TPH

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 2-10 Table per Hierarchy Inheritance 建模 问题 ...

  2. 《Entity Framework 6 Recipes》中文翻译系列 &lpar;8&rpar; -----第二章 实体数据建模基础之继承关系映射TPT

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 2-8 Table per Type Inheritance 建模 问题 你有这样一 ...

  3. 《Entity Framework 6 Recipes》中文翻译系列 &lpar;10&rpar; -----第二章 实体数据建模基础之两实体间Is-a和Has-a关系建模、嵌入值映射

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 2-11 两实体间Is-a和Has-a关系建模 问题 你有两张有Is-a和Has-a ...

  4. 《Entity Framework 6 Recipes》中文翻译系列 &lpar;7&rpar; -----第二章 实体数据建模基础之拆分实体到多表以及拆分表到多实体

    2-6 拆分实体到多表 问题 你有两张或是更多的表,他们共享一样的主键,你想将他们映射到一个单独的实体. 解决方案 让我们用图2-15所示的两张表来演示这种情况. 图 2-15,两张表,Prodeuc ...

  5. 《Entity Framework 6 Recipes》翻译系列 &lpar;5&rpar; -----第二章 实体数据建模基础之有载荷和无载荷的多对多关系建模

    2-3 无载荷(with NO Payload)的多对多关系建模 问题 在数据库中,存在通过一张链接表来关联两张表的情况.链接表仅包含连接两张表形成多对多关系的外键,你需要把这两张多对多关系的表导入到 ...

  6. 《Entity Framework 6 Recipes》翻译系列 &lpar;4&rpar; -----第二章 实体数据建模基础之从已存在的数据库创建模型

    不知道对EF感兴趣的并不多,还是我翻译有问题(如果是,恳请你指正),通过前几篇的反馈,阅读这个系列的人不多.不要这事到最后成了吃不讨好的事就麻烦了,废话就到这里,直奔主题. 2-2 从已存在的数据库创 ...

  7. 《Entity Framework 6 Recipes》中文翻译系列 &lpar;6&rpar; -----第二章 实体数据建模基础之使用Code First建模自引用关系

    2-5 使用Code First建模自引用关系 问题 你的数据库中一张自引用的表,你想使用Code First 将其建模成一个包含自关联的实体. 解决方案 我们假设你有如图2-14所示的数据库关系图的 ...

  8. 《Entity Framework 6 Recipes》中文翻译系列 目录篇 -持续更新

    为了方便大家的阅读和学习,也是响应网友的建议,在这里为这个系列做一个目录.在目录开始这前,我先来回答之前遇到的几个问题. 1.为什么要学习EF? 这个问题很简单,项目需要.这不像学校,没人强迫你学习! ...

  9. 《Entity Framework 6 Recipes》中文翻译 ---- 系列教程

    为了方便大家的阅读和学习,也是响应网友的建议,在这里为这个系列做一个目录.在目录开始这前,我先来回答之前遇到的几个问题. 1.为什么要学习EF? 这个问题很简单,项目需要.这不像学校,没人强迫你学习! ...

随机推荐

  1. jquery投色子动画

    可以点击这里体验效果:http://keleyi.com/keleyi/phtml/jqtexiao/26.htm 效果图: 代码如下: <!DOCTYPE HTML> <html& ...

  2. Android开发环境的搭建

    在学习android时,环境的搭建是学习android的第一步,为了记住第一步特写了这篇文章. 第一步,安装jdk,因为eclipse的运行需要jdk才可以,所以jdk的安装时第一步.安装过程和普通的 ...

  3. 在wex5平台grid里面的gridselect下拉不能显示汉字问题

    当grid里面有gridSelect组件的时候,gridSelect里面的bind-ref是对应的数据库存入字段(int类型),bind-labelRef是对应的计算字段(视图里面的),而option ...

  4. 【JAVA多线程问题之死锁】

    一.死锁是什么? 举个例子:两个人一起吃饭,每个人都拿了一只筷子,双方都在等待对方将筷子让给自己,结果两个人都吃不了饭.这种情况和计算机中的死锁情况很相似. 假设有两个线程,互相等待对方释放占有的锁, ...

  5. 微信网页授权&comma;微信登录&comma;oauth2

    微信官方文档: http://mp.weixin.qq.com/wiki 微信公众平台OAuth2.0授权详细步骤如下: 1. 用户关注微信公众账号.2. 微信公众账号提供用户请求授权页面URL.3. ...

  6. Yii CActiveForm

    http://blog.sina.com.cn/s/blog_685213e70101mo4i.html 文档: http://www.yiiframework.com/doc/api/1.1/CAc ...

  7. C语言&sol;C&plus;&plus;中怎样产生随机数

    C语言/C++怎样产生随机数:这里要用到的是rand()函数, srand()函数,和time()函数. 需要说明的是,iostream头文件中就有srand函数的定义,不需要再额外引入stdlib. ...

  8. Java中join&lpar;&rpar;方法的理解

    thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程. 比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B. t.join ...

  9. 转载 50种方法优化SQL Server数据库查询

    原文地址 http://www.cnblogs.com/zhycyq/articles/2636748.html 50种方法优化SQL Server数据库查询 查询速度慢的原因很多,常见如下几种: 1 ...

  10. Windows服务安装完成后自动启动

    public ServiceInstaller() { //... Installer code here this.AfterInstall += new InstallEventHandler(S ...