代码优先与模型/数据库优先

什么是使用entity framework4.1的代码优先模型/数据库先用EDMX图表的优点和缺点?

我试图完全理解使用EF 4.1构build数据访问层的所有方法。 我正在使用Repository模式和IoC

我知道我可以使用代码优先的方法:手工定义我的实体和上下文,并使用ModelBuilder来微调模式。

我也可以创build一个EDMX图,并select使用T4模板生成相同POCO类的代码生成步骤。

在这两种情况下,我最终都是ORM不可知的POCO对象和从DbContext派生的上下文。

数据库首先似乎是最吸引人的,因为我可以在企业pipe理器中devise数据库,快速同步模型并使用devise器对其进行微调。

那么这两种方法有什么区别呢? 这只是关于VS2010与企业pipe理器的偏好吗?

我认为差异是:

先编码

  • 非常受欢迎,因为硬核程序员不喜欢任何types的devise者,在EDMX xml中定义映射过于复杂。
  • 完全控制代码(没有自动生成的代码很难修改)。
  • 一般的期望是你不用打扰DB。 DB只是一个没有逻辑的存储。 英孚将处理创作,你不想知道它是如何做的。
  • 由于代码定义了数据库,因此对数据库的手动更改很可能会丢失。

数据库第一

  • 如果您有由DBAdevise的数据库,单独开发或者如果您有现有的数据库,则非常受欢迎。
  • 您将让EF为您创build实体,修改映射后您将生成POCO实体。
  • 如果您需要POCO实体中的其他function,您必须使用T4修改模板或使用部分类。
  • 数据库的手动更改是可能的,因为数据库定义了您的域模型。 你可以随时从数据库更新模型(这个function相当不错)。
  • 我经常一起使用VS数据库项目(只有Premium和Ultimate版本)。

模型第一

  • 恕我直言,stream行,如果你是devise师的粉丝(=你不喜欢写代码或SQL)。
  • 你将“画”你的模型,让工作stream生成你的数据库脚本和T4模板生成你的POCO实体。 您将失去对实体和数据库的部分控制,但对于小型简单的项目,您将会非常高效。
  • 如果您需要POCO实体中的其他function,您必须使用T4修改模板或使用部分类。
  • 数据库的手动更改很可能会丢失,因为您的模型定义了数据库。 如果您安装了数据库生成电源包,这会更好。 它将允许您更新数据库模式(而不是重新创build)或更新VS中的数据库项目。

我预计在EF 4.1的情况下,还有几个与Code First和Model / Database有关的其他function。 代码中使用的Fluent API首先不提供EDMX的所有function。 我期望像存储过程映射,查询视图,定义视图等function首先使用模型/数据库和DbContext (我没有尝试它),但他们不在代码第一。

我认为“编程entity framework”的作者Julie Lerman这个简单的“决策树”应该有助于做出更加自信的决定:

一个决策树,以帮助选择不同的方法与EF

更多信息在这里 。

数据库第一和模型第一没有真正的区别。 生成的代码是相同的,你可以结合这些方法。 例如,您可以使用devise器创build数据库,而不是使用sql脚本更改数据库并更新模型。

当你先使用代码时,你不能改变没有娱乐数据库的模型,也不能丢失所有的数据。 恕我直言,这个限制是非常严格的,不允许在生产中首先使用代码。 现在它不是真正可用的。

代码的第二个小缺点是模型构build器需要master数据库的特权。 如果您使用SQL Server Compact数据库或者如果您控制数据库服务器,这不会影响您。

代码的优点是非常简洁的代码。 您可以完全控制此代码,并可以轻松修改并将其用作视图模型。

当您创build简单的独立应用程序而无需版本控制,并且首先在需要修改生产的项目中使用model \ database时,我可以推荐使用代码优先的方法。

引用http://www.itworld.com/development/405005/3-reasons-use-code-first-design-entity-framework中的相关部分;

entity framework使用代码优先devise的3个原因

1)less克制,less膨胀

使用现有的数据库来生成.edmx模型文件和相关的代码模型会导致一大堆自动生成的代码。 你必须永远不要触摸这些生成的文件,否则你会破坏某些东西,或者你的改变在下一代被覆盖。 上下文和初始化程序在这个混乱中也一起卡住了。 当您需要为生成的模型添加function(如计算的只读属性)时,需要扩展模型类。 这最终成为几乎所有型号的要求,并最终扩展到一切。

用代码首先你的手编码模型成为你的数据库。 您正在构build的确切文件是生成数据库devise的内容。 没有额外的文件,当你想添加属性或其他数据库不需要知道的东西时,不需要创build类扩展。 只要你遵循正确的语法,你可以将它们添加到同一个类中。 哎呀,你甚至可以生成一个Model.edmx文件来可视化你的代码,如果你想。

2)更好的控制

当你首先进入数据库时​​,你可以为你的模型生成什么样的东西以供你的应用程序使用。 有时命名约定是不可取的。 有时候,关系和联想不是你想要的。 其他时候,与延迟加载的非瞬态关系会严重影响您的API响应。

虽然几乎总是有可能遇到的模型生成问题的解决scheme,但是首先执行代码将为您提供完整细致的控制。 您可以从舒适的业务对象中控制代码模型和数据库devise的每个方面。 您可以精确地指定关系,约束和关联。 您可以同时设置属性字符限制和数据库列大小。 您可以指定哪些相关集合被急切加载,或者根本不被序列化。 总之,你负责更多的东西,但你完全控制你的应用程序devise。

3)数据库版本控制

这是一个很大的问题。 版本控制数据库非常困难,但是首先使用代码和代码优先进行迁移,则效率更高。 由于您的数据库模式完全基于您的代码模型,通过控制源代码的版本,您可以帮助您对数据库进行版本pipe理。 你负责控制你的上下文初始化,这可以帮助你做种子固定的业务数据。 您还负责创build代码第一次迁移。

首次启用迁移时,会生成configuration类和初始迁移。 最初的迁移是您当前的模式或基准v1.0。 从这一点上,你将添加时间戳和标签描述符的迁移,以帮助订购版本。 从包pipe理器中调用add-migration时,会生成一个新的迁移文件,其中包含在UP()和DOWN()函数中自动更改代码模型中的所有内容。 UP函数将更改应用于数据库,DOWN函数在您要回滚的事件中删除相同的更改。 更重要的是,您可以编辑这些迁移文件以添加其他更改,例如新的视图,索引,存储过程等等。 它们将成为您的数据库模式的真正的版本控制系统。

代码最初似乎是后起之秀。 我简要介绍了Ruby on Rails,他们的标准是代码优先,数据库迁移。

如果你正在构build一个MVC3应用程序,我相信Code首先有以下优点:

  • 简单的属性装饰 – 你可以用validation,需要等属性来装饰字段,用EFbuild模非常尴尬
  • 没有奇怪的build模错误 – EFbuild模通常有奇怪的错误,例如当您尝试重命名关联属性,它需要匹配底层的元数据 – 非常僵化。
  • 不要尴尬合并 – 当使用代码版本控制工具,如mercurial,合并.edmx文件是一个痛苦。 你是一个习惯于C#的程序员,并且你正在合并一个.edmx。 代码优先不是这样。
  • 先对照代码,完全控制,没有所有隐藏的复杂性和未知的情况下处理。
  • 我build议您使用Package Manager命令行工具,甚至不要使用graphics工具将新控制器添加到脚手架视图。
  • 数据库迁移 – 然后你也可以启用迁移。 这是如此强大。 您可以使用代码对模型进行更改,然后框架可以跟踪模式更改,以便您可以无缝地部署升级,同时自动升级模式版本(并在需要时降级)。 (不知道,但这可能也适用于模型优先)

更新

该问题还要求将代码优先与EDMX模型/ db-first进行比较。 代码优先也可以用于这两种方法:

  • Model-First首先对POCO进行编码(概念模型),然后生成数据库(迁移); 要么
  • 数据库优先 :给定一个现有的数据库, 手动编码POCO匹配。 (这里的区别在于POCO不会自动生成给现有的数据库)。 您可以使用entity framework或entity framework使用生成POCO类和现有数据库的映射来自动closures自动化5 – 如何从现有数据库生成POCO类 。

我首先使用EF数据库,以提供更多的灵活性和对数据库configuration的控制。

EF代码第一和模型首先看起来很酷,并且提供了数据库独立性,但是这样做不允许您指定我认为非常基本和常见的数据库configuration信息。 例如表索引,安全元数据,或者有一个主键包含多个列。 我发现我想使用这些和其他常见的数据库function,因此不得不直接做一些数据库configuration。

我发现在数据库中生成的默认POCO类是非常干净的,但缺乏非常有用的数据注释属性或存储过程的映射。 我使用了T4模板来克服这些限制。 T4模板非常棒,尤其是与自己的元数据和部分类相结合的时候。

模型首先似乎有很多潜力,但是在复杂的数据库模式重构过程中给了我很多错误。 不知道为什么。

在SP1之前,使用大型模型的速度非常慢,(在SP1之后还没有尝试过,但据说现在是一个快速的)。

我仍然先devise我的表格,然后一个内部构build的工具为我生成POCO,所以它为每个poco对象完成重复任务的负担。

当您使用源代码pipe理系统时,您可以轻松地跟踪您的POCO的历史logging,使用devise器生成的代码并不容易。

我有一个POCO基础,这使得很多事情变得非常简单。

我对所有的表都有意见,每个基本视图为我的外键提供了基本的信息,而我的视图POCO是从我的POCO类中派生出来的,这又是非常有用的。

最后我不喜欢devise师。

数据库的第一个办法是

无需编写任何代码: ASP.NET MVC / MVC3数据库优先方法/数据库

我认为这比其他方法更好,因为这种方法数据丢失较less。

恕我直言,我认为,所有的模型都有一个很好的地方,但我与模型的第一种方法的问题是在许多大型企业DBA的控制数据库,你没有得到build设应用程序的灵活性,而不使用数据库的第一种方法。 我曾经参与过许多项目,当他们想要部署时,他们想要完全控制。

因此,尽pipe我同意所有可能的变体Code First,Model First,Database首先,您必须考虑实际的生产环境。 因此,如果您的系统将成为一个拥有大量用户和DBA的大型用户群应用程序,那么您可以考虑数据库优先选项。