entity-framework - Code-first vs Model/Database-first

  显示原文与译文双语对照的内容

的优点&缺点使用 Entity Framework 4.1 Code-first/模型/database-firstedmx图?

我正在尝试充分理解使用 EF 4.1构建数据访问层的所有方法。 我正在使用知识库模式和 IoC 。

我知道我可以使用code-first方法: 手动定义我的实体和上下文,并使用ModelBuilder来 fine-tune 。

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

在这两种情况下,我最终都使用了POCO对象,这些对象是不可知的,并且是来自 DbContext的上下文。

Database-first似乎最有吸引力,因为我可以在企业管理器中设计数据库,快速同步模型并使用设计器对它进行 fine-tune 。

那么这两种方法之间的区别是什么? 是关于 web sphere vs 企业经理的偏好?

时间: 原作者:

我认为差异是:

磅代码第一个

  • 非常流行,因为硬核程序员不喜欢任何类型的设计器,并且在 EDMX xml中定义映射太复杂了。
  • 完全控制代码( 没有可以修改的自动生成的代码) 。
  • 一般的期望是你不使用数据库。 DB只是一个没有逻辑的存储。 EF会处理创建,你不想知道它是如何工作的。
  • 对数据库的手动更改可能会丢失,因为你的代码定义了数据库。

数据库

  • 如果dba设计了数据库,单独开发或者有现有数据库,则非常流行。
  • 你将让EF为你创建实体,修改映射之后,你将生成POCO实体。
  • 如果你想要在POCO实体中附加特性,你必须要么修改模板,要么使用分部类。
  • 数据库的手动更改是可能的,因为数据库定义了你的域模型。 你总是可以从数据库( 这项功能很好) 更新模型。
  • 我经常将这个项目用于 vs 数据库项目( 只有高级和最终版本) 。

磅模型第一个

  • 如果你是设计师的粉丝,我很受欢迎。
  • 你将创建你的模型并让工作流生成你的数据库脚本和T4模板来生成你的POCO实体。 你将失去控制你的实体和数据库的一部分,但对于小型简单项目你会非常有效率。
  • 如果你想要在POCO实体中附加特性,你必须要么修改模板,要么使用分部类。
  • 由于你的模型定义了数据库,对数据库的手动更改可能会丢失。 如果安装了数据库生成电源包,这将更好。 它将允许你更新数据库架构( 而不是重新创建) 或者更新 vs 中的数据库项目。

我希望在 EF 4.1的情况下,还有一些与代码第一个 vs 模型/数据库相关的特性。 代码中使用的Fluent API不提供EDMX的所有特性。 我希望等功能存储过程映射,查询视图,定义视图 等等 当使用模型/数据库第一次工作, DbContext ( 我还没试过) 但他们不先在代码中。

我认为"决策树"Lerman的作者应该帮助做出更自信的决策:

a decision tree to help choosing different approaches with EF

更多信息这里

原作者:

数据库首先和模型没有真正的差异。 生成的代码是相同的,你可以组合这种方法。 例如可以使用设计器创建数据库,而不是使用sql脚本更改数据库并更新模型。

当你首先使用代码时,你不能在没有recreation数据库和丢失所有数据的情况下改变模型。 抱歉,这里限制非常严格,不允许在生产中首先使用代码。 这将在即将进行的代码第一次迁移时解决。 但现在它并不是真正有用的。

代码的第二个次要缺点是模型生成器需要主数据库的特权。 如果你使用 SQL Server Compact 数据库或者控制数据库服务器,这不会影响你。

代码的优点是非常干净和简单的代码。 你可以完全控制这里代码,并且可以轻松地修改并使用它作为视图模型。

我可以建议在创建简单独立应用程序时使用代码第一种方法,而在需要修改的项目中首先使用 modeldatabase 。

代码首先似乎是上升的恒星。 我快速查看了 Ruby on Rails,它们的标准是代码,数据库迁移。

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

  • 简单属性装饰——你可以装饰字段验证,需要, 等等 。 属性,使用EF建模是非常困难
  • 没有 - ef造型怪异的造型错误经常有奇怪的错误,比如当你试图重命名一个关联属性,它需要匹配底层meta-data——非常死板。
  • 不尴尬的合并——当使用代码版本控制工具,如变幻无常,合并. edmx 文件是一种痛苦。 你是一个习惯于 C#的程序员,你在那里合并一个. edmx. 而不是 code-first 。
  • 对比代码首先和你完全控制没有隐藏的复杂性和未知数来处理。
  • 我建议你使用软件包管理器 命令行 工具,甚至不使用图形化工具将新控制器添加到脚手架视图中。
  • DB-Migrations - 然后你也可以 Enable-Migrations 。 这是如此强大。你更改你的模型代码,然后框架可以跟踪模式变化,所以你可以无缝部署升级,与模式版本自动升级( 如果需要则降级) 。 ( 不确定,但这可能也适用于 model-first )

更新

这个问题还要求对code-first和EDMX模型/db-first进行比较。 Code-first也可以用于以下两种方法:

原作者:

3 使用 Entity Framework 进行代码首次设计的原因

膨胀 1 )少毫不相干,少

使用现有数据库生成. edmx 模型文件和相关的代码模型会产生大量自动生成的代码。 你是implored再也不碰这些生成的文件以免你打破的东西,或者你的更改得到覆盖在下一代。 上下文和初始值设定在这个混乱中被阻塞了。 当你需要向生成的模型添加功能时,如计算的只读属性,你需要扩展模型类。 这几乎是每个模型的一个需求,你最终会得到一个扩展。

代码首先你的手编码模型成为你的数据库。 你正在构建的确切文件是什么生成数据库设计。 没有额外的文件,不需要创建一个类扩展当你想添加属性或者其他数据库不需要知道。 只要遵循正确的语法,就可以将它们添加到同一个类中。 如果你想要的话,你甚至可以生成一个 Model.edmx 文件来可视化你的代码。

2 ) 更高的控制

当你去db第一,你的摆布生成模型在应用程序中使用。 有时命名约定是不可取的。 有时候关系和关联并不是你想要的。 其他时候,延迟加载的非瞬态关系严重破坏了你的API响应。

虽然几乎总是一个解决方案模型生成问题你可能会遇到,代码首先给你完整和细粒度的控制。 你可以从业务对象的舒适度来控制代码模型和数据库设计的各个方面。 你可以精确地指定关系,约束和关联。 你可以同时设置属性字符限制和数据库列大小。 你可以指定要加载哪些相关集合,或者根本不序列化。 简而言之,你对更多的东西负责,但你完全控制你的应用设计。

3 ) 数据库版本控制

这是一个大的。 版本控制数据库很困难,但是代码首先和代码第一次迁移,它更有效。 因为你的数据库模式是完全基于代码模型,通过版本控制源代码,你正在帮助你的数据库。 你负责控制上下文初始化,这可以帮助你完成种子固定业务数据之类的事情。 你还负责创建代码首次迁移。

首次启用迁移时,会生成一个配置类和一个初始迁移。 初始迁移是你当前的架构或者你的基线 v1.0. 从那一刻起,你将添加迁移时间标记和标签的描述符帮助订购版本。 当你叫add-migration包管理器,一个新的迁移文件将生成的代码中包含的一切改变了模型自动 UP() 和 DOWN() 函数。 函数将更改应用到数据库,减少函数删除相同的事件要回滚的变化。 此外,你可以编辑这些迁移文件以添加其他更改,如新视图,索引,存储过程和其他任何更改。 它们将成为你的数据库架构的一个真正的版本控制系统。

http://www.itworld.com/development/405005/3-reasons-use-code-first-design-entity-framework

原作者:

我首先使用EF数据库来提供更多的灵活性和对数据库配置的控制。

EF代码首先和模型首先看起来很酷,并提供数据库独立性,但是在这样做中,它不允许你指定我认为非常基本的数据库配置信息。 例如表索引,安全元数据或者包含多个列的主键。 我发现我想使用这些和其他通用数据库功能,因此必须直接进行一些数据库配置。

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

模型首先似乎有很多潜力,但是在复杂的数据库架构重构过程中给我提供了大量的Bug 。 不确定为什么。

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

我还是先设计我的表,然后内部构建的工具为我生成了 POCOs,所以它承担了每个poco对象重复任务的负担。

当你使用源代码控制系统时,你可以很容易地跟踪你的POCOs的历史,而设计器生成的代码并不容易。

我有一个POCO的基础,这使得很多事情很容易。

我的所有表都有视图,每个基础视图为我的外键带来基本信息,我的视图POCOs从我的POCO类派生,这非常有用。

最后我不喜欢设计师。

原作者:

数据库第一种方法:

不编写任何代码: ASP.NET mvc/mvc3数据库第一个方法/数据库

我认为它比其他方法更好,因为数据损失比这种方法少。

恕我直言,我认为所有的模型有一个伟大的地方但是问题我先与模型方法在许多大型企业控制数据库的dba你不先构建应用程序不使用数据库的灵活性的方法。 我曾经从事过许多项目,当它开始部署时,他们需要完全控制。

所以,我尽可能地同意所有可能的变化代码,首先是模型,数据库,你必须考虑实际的生产环境。 所以如果你的系统是一个庞大的用户基础应用程序,拥有很多用户并运行了 dba,那么你可以考虑数据库的第一个选项。

...