颇有可能,你才开始探索实体框架,你可能会问“咱们怎么开始?”,若是你真是这样的话,那么本章就是一个很好的开始。若是不是,你已经建模,并在实体分裂和继承方面感受良好,那么你能够跳过本章。数据库
本章将带你漫游使用实体框架建模的基本实例,建模是实体框架的核心特性,同时也是区别实体框架和微软早期的数据访问平台的特性。一旦建好模,你就能够面向模型编写代码,而不用面向关系数据库中的行和列。架构
本章以建立一个简单概念模型的实例开始,而后让实体框架建立底层的数据库,剩下的实例,将向你展现,如何经过数据库中已存在的表以及它们之间的关系来建模。框架
问题ide
你有一个崭新的项目,须要建立一个模型。工具
解决方案spa
咱们设想你须要建立一个管理,人员姓名、电话号码的应用程序。为了保持尽量的简单,咱们假设你只须要一个实体类型:Person。翻译
按如下步骤来建立模型:设计
1.右键你的项目,而后选择➤New Item(新建项)。3d
2.从模板中选择 ADO.NET Entity Data Model(ADO.NET实体数据模型),而后点击Add(增长)。该模板在Visual C#条目下面的Data项下面。(如图2-1)。code
图2-1 增长一个新的.emdx文件,其中包含使用XML描述的概念模型、存储模型、映射层
3.在向导第一步选择Empty Model(空模型)并点击Finish(完成)按钮。向导将建立一个新的设计器界面上为空的概念模型。
4.右键设计器界面,选择增长➤Entity(实体)。
5.在Entity Name(实体名称)字段键入Person,选中Create a Key Propety(建立实体键)复选框,使用Id做为实体键并确保其类型为Int32.点击OK按钮,一个新的Person实体便出如今设计器窗口中(如图2-2)。
图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所示。
图2-3 模型包含一个表明Person的实体类型
你已经完成了一个简单的概念模型。不过从该模型生成数据库,还有一些工做要作:
9.须要更改咱们模型的一些属性,以帮助咱们生成数据库。右键计设器窗口,选择properties(属性)。更改数据库架构名称(Database Schema name)为Chapter2,更改实体容器名称(Entity Container Name)为EF6RecipesContext。如图2-4所示。
图2-4 更改模型属性
10.右键设计器窗口并选择Generate Database Script from Model(根据模型生成数据库)。选择一个已存在的数据库链接或者新建一个链接。图2-5,咱们选择建立一个新的本地数据库EF6Recipes的链接。
图2-5建立一个实体框架从概念模型建立数据库脚本要使用的数据库链接
11.单击OK按钮完成链接属性设置,而后单击Next(下一步)预览数据库脚本(如图2-6)。一旦点击Finish(完成),生成的脚本就被添加到你的项目中。
图2-6 在.edmx文件中生成存储逻辑模型并建立数据库脚本
12.在SSMS(SQL Server Management Studio)查询窗口中执行上面生成的数据库脚本建立数据库和People表。
原理
实体框架设计器是一个建立概念模型、存储模型和映射层的强有力工具。它提供双向建模的功能,你能够从一个空白的模型设计窗口建模,也可经过导入一个已存在的数据库来建立概念模型、存储模型和映射层。当前版本提供了有限的双向建模功能,它容许从模型从新建立数据库,根据数据库的改变来更新模型。
概念模型拥有不少影响生成存储逻辑模型和数据库脚本的属性,咱们更改了其中的两个属性,第一个是容器的名称,他是继承至DbContext上下文对象。咱们给它命名为EF6RecipesContext,它与本书使用的上下文对象保持一致。
另外一个是,更改了表示生成存储逻辑模型和数据库脚本的架构名称为“Chaper2”。
代码清单2-1演示了,咱们建立和插入Person实体类型的实例,并将全部Person实体保存到数据库。
代码清单2-1. 从模型中插入和获取数据
1 using (var context = new EF6RecipesContext()) { 2 var person = new Person { 3 FirstName = "Robert", 4 MiddleName = "Allen", 5 LastName = "Doe", 6 PhoneNumber = "867-5309" 7 }; 8 context.People.Add(person); 9 person = new Person { 10 FirstName = "John", 11 MiddleName = "K.", 12 LastName = "Smith", 13 PhoneNumber = "824-3031" 14 }; 15 context.People.Add(person); 16 person = new Person { 17 FirstName = "Billy", 18 MiddleName = "Albert", 19 LastName = "Minor", 20 PhoneNumber = "907-2212" 21 }; 22 context.People.Add(person); 23 person = new Person { 24 FirstName = "Kathy", 25 MiddleName = "Anne", 26 LastName = "Ryan", 27 PhoneNumber = "722-0038" 28 }; 29 context.People.Add(person); 30 context.SaveChanges(); 31 } 32 using (var context = new EF6RecipesContext()) { 33 foreach (var person in context.People) { 34 System.Console.WriteLine("{0} {1} {2}, Phone: {3}", 35 person.FirstName, person.MiddleName, 36 person.LastName, person.PhoneNumber); 37 } 38 }
代码清单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/