Entity Framework 4中的Code-First, Model-First和Database-First模式
https://www.doczj.com/doc/ec15956299.html,/n-pei/archive/2010/08/12/1797751.html
我使用Entity Framework是在开始学习Silverlight的时候。用了半年左右。最近https://www.doczj.com/doc/ec15956299.html,团队发布了EF Feathure CTP 4。主要是增加了Code First这个功能。
在说明Code First之前,先和大家回顾下
EF4增加的新特性
1.外键支持(Foreign Keys)
可以通过直接设置外键属性来设置实体之间的关系。
2.延迟加载支持
这个功能默认情况下是开启的,也就是说一个查询操作返回的实体只有在被用到时才从服务器加载。
3. POCOs支持
这样你的实体对象就可以独立于EF而存在。不懂POCOs?没关系,这里有几篇很好的文章帮助你理解:
https://www.doczj.com/doc/ec15956299.html,/b/adonet/archive/2009/05/21/poco-in-the-entity-framework-part-1-the-exp erience.aspx
https://www.doczj.com/doc/ec15956299.html,/b/adonet/archive/2009/05/28/poco-in-the-entity-framework-part-2-comple x-types-deferred-loading-and-explicit-loading.aspx
https://www.doczj.com/doc/ec15956299.html,/b/adonet/archive/2009/06/10/poco-in-the-entity-framework-part-3-change -tracking-with-poco.aspx
4.T4代码生成的支持
T4不但简化了代码生成的个性化配置,而且让开发人员对代码有了更灵活和强大的控制。
5.更好的N-Tier设计支持
6.改进SQL语句的生成
为了提供EF生成的SQL语句的可读性和性能,在EF4中,查询生成SQL的部分做了很大的改进。
7.增强对存储过程的支持
这篇文章里我将会和大家探讨下Database First模式,Model First模式和Code First模式在EF4
和VS2010中如何使用以及它们的优缺点。
Database First模式的介绍
这个是最早也是最简单的模式。当然新手可以看看下面的内容,如果是EF使用很久了请跳过这里。首先在创建好的VS2010的工程中,右键添加新项,添加https://www.doczj.com/doc/ec15956299.html, Entity Data Model:
点击下一步,选择从数据库生成:
点击下一步,你就可以选择你需要使用的数据库,我这里使用NorthWind:
选择好数据库后点击下一步,选择你要用到的表,试图或者是存储过程:然后点击完成,VS2010自动为你生成好了Data Model:
当然这个功能限制了开发人员对整个生成的Data Model的修改,于是出来了POCOs的使用。使用POCOs让开发人员对数据库的操作更加灵活。
Model First模式的介绍
之前我有一篇文章使用MVVM+MEF+Silverlight实现的Sellthrough文章里面介绍了使用Model First的模式。好像这个模式大家用的并不多,大部分人现在使用的是POCOs。如果建立一个小的数据模型,在设计实体关系模型时我觉得完全可以使用Model First来进行。
熟悉Model First的你完全可以跳过下面的例子继续看Code First部分了。
在Database First中我们创建的Model是
那么Model First中我们需要创建的就只是一个空Model。如上图:
在创建好一个空的Model后,在这个Model的设计模式下右键选择新增,新增一个实体:
我们给它命名为Products:
点击确定,为这个Entity添加属性:比如:name,Supplier,UnitPrice。
同样的方法我们为这个Data Model添加一个Customers实体,它的属性有Company,Name,Title。创建好的Model如下:
这么简单的模型对于我们来说没有意义,所以接下来我们要给实体之间加上关系对应。
在这个Data Model的设计界面的空白处,右键选择添加,添加关联(Association):
Customer和product是n-n的关系,所以我们给他们每个人增加一个Navigation Properties:
都是Many-Many。创建好Model后,我们下一步就是用这个Model来生成数据库脚本了。
在空白处点击右键:
选择从Model生成数据库,VS2010会给你向导,在向导页面选择新连接,然后输入一个数据库名(目前不存在的)。系统会提示你,数据库不存在,是否要创建,选择是。
完成后你会发现你的项目中多了个sql脚本:
现在你需要做的只是打开SQL Server Management Studio并运行下上面这个SQl脚本。
Code First模式
这个模式是我要重点说明的。使用Code first这个模式后,你的项目中可以说就不再需要.edmx这种系统自动生成的Data Model了。
这部分我还不是很有把握,很多东西还没学。但是我会用两个例子来告诉大家如何使用ObjectContext和DBContext来直接创建数据库。
既然是Code First那么最重要的就是我们创建实体的部分了。创建好了实体,我们再去创建ObjectContext或者是DBContext,最终借助ObjectContext或者是DBContext来完成数据库的自动创建。
实体的创建:
很简单的几个实体。书籍,作者出版商。
接下来我们创建一个BookCatalog,它继承了ObjectContext类,这里需要注意的是在BookCatalog 的构造函数中有个SqlConnection的参数。
我们就是要靠这个连接字符串来创建数据库所在的位置和名称。
除此之外就是要注意对象集ObjectSet的使用:
其它的出版商和作者是BookCatolog的ObjectSet。
完成这个类后,和上面的Model First遇到的问题相同,这么简单的东西不可能满足我们的业务需求的。所以引出来了EntityConfiguration类。如何使用呢?
首先我们创建一个BookConfiguration类,继承了EntityConfiguration,代码如下:
HasKey:设置主键,
IsRequired()不为空字段,
WithMany是一对多。
上面的这些属性就是为了在生成数据库时Book的表有主键,有不为空字段和外键关系。
我们来使用它创建个数据库试试。
我这里使用一个控制台应用程序来执行测试的。
在Main方法入口中,我们首先需要创建一个ModelBuilder,使用它我们才能使用Configuration 类和创建一个Model,接着创建Object。
Ok,有个model后,就可以借助上面的BookCatalog来创建数据库,被就行数据操作:
从代码中可以看到model首先是创建了一个ObjectContext,然后这个context去判断给数据库是否存在(CodeFirstWalkthrough),不存在就创建这个数据库。
最后是在数据库中添加一条记录。
运行后看结果:
下面说明如何使用DbContext来创建数据库:
首先还是创建一个类继承了DbContext这个类:
它的属性类型是DbSet,在ObjectContext中式ObjectSet,很相似。
使用它来创建数据库:
这个比用ObjectContext创建数据库要简单多了,但是你会发现我们的SimpleBookCatalog的构造函数需要的参数只是个DbModel,那么运行它后创建的数据库呢???????默认的你的机器必须是安装了SQL express,数据库已经被创建好在那里。
那么数据库的名称呢?因该是Projectname.SimpleBookCatalog,和你的DbContext名字相同。如果你想创建在其它地方可以吗?当然可以。很多方式,首先是构造函数中给出来sqlconnection,像上面的ObjectContext创建数据库。
第二个方式就是在App.config文件在connectionStrings节点处配置好你的数据库连接串。
你可以使用sql server ,sql express或者是SQL CE。链接字符串的名字必须是SimpleBookCatalog。
分析这三种方式的优缺点,
Database-First模式明显性能会差点,但是它很适合初学者,或者是比较急的小型项目。
Model-First模式优点是开发人员能够在设计模型时完全了解数据库的结构,但是缺点是在模型设计完后,还是需要去手动创建数据库,并且生成的脚本有点不简洁。
Code-First模式有点不用说了,就是上面两个模式的缺点。缺点应该也是有很多的,比如更新数据库。
大家可以说说自己的意见