波斯马BOSSMA Information Technology

当代码优先(Code First)不是先写代码

发布时间:2011年4月20日 / 分类:DOTNET / 26,470 次浏览 / 评论

这篇文章翻译自:http://blogs.msdn.com/b/adonet/archive/2011/03/07/when-is-code-first-not-code-first.aspx

非直译,其中添加了我的理解及部分其它文章内容。

  在最近发布的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,那么数据库优先或者模型优先更适合你,特别是你的数据库已经存在,并且数据库管理员不想让你再去动它。

本博客所有文章如无特别注明均为原创。
复制或转载请以超链接形式注明转自波斯马,原文地址《当代码优先(Code First)不是先写代码

关键字:

建议订阅本站,及时阅读最新文章!
【上一篇】 【下一篇】

发表评论