Entity Framework Code First 的用途 和 原理 -摘自网络
在最近发布的EF4.1中包含支持使用代码优先(Code First)的方式进行EF开发。目前实体框架已经支持三种方式:数据库优先、模型优先,以及代码优先。然而,代码优先并不是总是意味着先写代码,这一点有点让人迷惑不解。
数据库优先
数据库优先背后的意思是,你的项目已经有一个数据库,并且使用工具(如Visual Studio中的EF设计器)依据数据库生成C#或VB类。你可以通过EF设计器修改这些创建的类以及类和数据库之间的映射关系;天、如果你觉得自己很勇 敢,你甚至可以直接修改XML。这种方式的关键是先要有数据,然后才有代码和模型。
模型优先模型
优先背后的意思是,通过在EF设计器中创建一个空的容器,在其中设计实体数据模型。这个模型将用于生成数据库以及C#或者VB类。这种方式的关键是先要有模型,然后才有数据库和代码。
代码优先生成数据库
代码优先最原始的原型实际上被叫做只有代码(Code Only)。这是因为开发者只需要写代码,将会自动创建模型和数据库。 这种方式会被视为模型优先的方式,这取决于你如何看待模型。在上边的模型优先的介绍中提到模型是通过在EF设计器中进行设计,但是很多开发者会通过代码为 他们的应用领域制作模型。通过代码来实现领域模型的方式通常会与领域驱动设计(Domain Driven Design)关联起来,在这种情况下,可以把代码优先视为模型优先的方式。
使用代码优先的方式生成数据库是一种强大的方式,并且很多人也正在使用,但是这种方式并不是适合所有情况的。
代码优先和已经存在的数据库
想象一下你已经有一个数据库,并且你的数据库管理员不允许你修改数据库,这个时候还能使用代码优先吗?当然可以,很多人已经在用了。而且这不是一个事后的想法,代码优先已经专门为这种情况设计,步骤很简单:
1、 为DbContext配置已经存在的数据库,最简单的方法就是在config文件中添加数据连接配置,并且设置数据连接的名称为你继承自DbContext的类的名称。
2、 创建类映射到你的数据库
3、 使用数据注解或者fluent API为模型类指定正确的到数据库的映射 这种方式实际上是一种数据库优先的方式,只不过我们使用代码映射,代替VS设计器和XML。
Code First != DbContext
DbContext不仅可以用于代码优先方式,也可以用于数据库优先和模型优先。参考:http://www.cnblogs.com/snowdream/archive/2011/01/22/entity-framework-feature-codefirst-create-database-and-model.html
但是通过上述数据库生成继承DbContext的方式并不是Code First,会在运行时加载edmx文件。所以要删除edmx,修改config文件中edmx的数据连接字符串,以及修改部分方法和model类。这个生成模板只不过节省了我们自己写代码的时间。
而且代码优先也可以使用ObjectContext代替DbContext,当然不推荐这样做。
那么代码优先适合我吗?
这取决于你喜欢怎么样创建你的C#或者VB类,以及在类与数据库之间的映射。
如果你使用代码创建这些,则代码优先适合你;
如果喜欢用VS设计器或者XML,那么数据库优先或者模型优先更适合你,特别是你的数据库已经存在,并且数据库管理员不想让你再去动它。