Jak*_*cki 607 entity-framework poco ef-code-first entity-framework-4.1 ef-database-first
使用实体框架4.1代码优先于模型/数据库优先使用EDMX图表有什么优缺点?
我正在尝试完全理解使用EF 4.1构建数据访问层的所有方法.我正在使用Repository模式和IoC.
我知道我可以使用代码优先方法:手动定义我的实体和上下文并用于ModelBuilder微调模式.
我还可以创建一个EDMX图表并选择一个代码生成步骤,该步骤使用T4模板生成相同的POCO类.
在这两种情况下,我最终POCO都得到了ORM不可知的对象和源自的上下文DbContext.
数据库优先似乎最吸引人,因为我可以在企业管理器中设计数据库,快速同步模型并使用设计器对其进行微调.
那么这两种方法有什么区别?是仅仅关于VS2010与企业管理器的偏好?
Lad*_*nka 690
我认为差异是:
代码优先
数据库第一
模型第一
我希望在EF 4.1的情况下,首先还有一些与Code First与Model/Database相关的其他功能.Code中使用的Fluent API不提供EDMX的所有功能.我希望存储过程映射,查询视图,定义视图等功能首先使用模型/数据库时工作DbContext(我还没有尝试过),但它们不在Code中.
小智 129
我认为"编程实体框架"的作者Julie Lerman的这个简单的"决策树"应该有助于更有信心地做出决定:

更多信息在这里.
小智 51
数据库优先和模型优先没有实际差异.生成的代码是相同的,您可以组合这些方法.例如,您可以使用designer创建数据库,而不是使用sql脚本更改数据库并更新模型.
首次使用代码时,如果没有重新创建数据库并丢失所有数据,则无法更改模型.恕我直言,这个限制是非常严格的,不允许在生产中首先使用代码.目前它还没有真正实用.
代码的第二个小缺点是模型构建器需要master数据库的特权.如果您使用SQL Server Compact数据库或控制数据库服务器,这不会影响您.
代码优势首先是非常简洁和简单的代码.您可以完全控制此代码,并可以轻松修改并将其用作视图模型.
当您创建简单的独立应用程序而不进行版本控制并在需要在生产中进行修改的项目中首先使用model\database时,我可以建议使用代码优先方法.
Jah*_*han 36
从http://www.itworld.com/development/405005/3-reasons-use-code-first-design-entity-framework引用相关部分
使用代码优先设计实体框架的3个理由
1)减少臃肿,减少膨胀
使用现有数据库生成.edmx模型文件和相关的代码模型会产生大量自动生成的代码.你恳求永远不要触摸这些生成的文件,以免你破坏某些东西,或者你的更改会被下一代覆盖.上下文和初始化程序也在这个混乱中被卡在一起.当您需要向生成的模型添加功能时,例如计算的只读属性,您需要扩展模型类.这最终成为几乎所有模型的要求,并最终为所有内容提供扩展.
使用代码,您的手动编码模型将成为您的数据库.您正在构建的确切文件是生成数据库设计的原因.没有其他文件,当您想要添加属性或数据库不需要了解的任何其他内容时,无需创建类扩展.只要遵循正确的语法,您就可以将它们添加到同一个类中.哎呀,如果需要,您甚至可以生成一个Model.edmx文件来显示您的代码.
2)更好的控制
当您首先使用数据库时,您将受到为您的应用程序使用的模型生成的内容的摆布.偶尔命名约定是不合需要的.有时,关系和联想并不是你想要的.其他时候,与延迟加载的非瞬态关系会对您的API响应造成严重破坏.
虽然几乎总有一个解决方案可能会遇到模型生成问题,但是代码首先会为您提供完整且细粒度的控制.您可以在舒适的业务对象中控制代码模型和数据库设计的各个方面.您可以精确指定关系,约束和关联.您可以同时设置属性字符限制和数据库列大小.您可以指定要急切加载哪些相关集合,或者根本不进行序列化.简而言之,您负责更多的东西,但您可以完全控制您的应用程序设计.
3)数据库版本控制
这是一个很大的问题.版本控制数据库很难,但是代码优先和代码优先迁移,它更有效.因为您的数据库模式完全基于您的代码模型,所以通过控制源代码的版本,您可以帮助对数据库进行版本控制.您负责控制上下文初始化,这可以帮助您执行诸如播种固定业务数据之类的操作.您还负责创建代码首次迁移.
首次启用迁移时,将生成配置类和初始迁移.初始迁移是您当前的架构或基准v1.0.从那时起,您将添加时间戳并带有描述符标记的迁移,以帮助排序版本.从包管理器调用add-migration时,将生成一个新的迁移文件,其中包含在UP()和DOWN()函数中自动更改代码模型中的所有内容.UP函数将更改应用于数据库,DOWN函数在要回滚的事件中删除相同的更改.此外,您还可以编辑这些迁移文件以添加其他更改,例如新视图,索引,存储过程以及其他任何更改.它们将成为数据库模式的真正版本控制系统.
Tod*_*odd 30
代码优先似乎是后起之秀.我快速浏览了Ruby on Rails,它们的标准是代码优先,具有数据库迁移.
如果您正在构建MVC3应用程序,我相信Code首先具有以下优势:
更新
该问题还要求将代码优先与EDMX模型/ db-first进行比较.代码优先也可以用于这两种方法:
use*_*371 11
我首先使用EF数据库,以便提供更多的灵活性和对数据库配置的控制.
EF代码优先和模型首先看起来很酷,并提供数据库独立性,但是在这样做时它不允许您指定我认为非常基本和常见的数据库配置信息.例如,表索引,安全元数据或具有包含多个列的主键.我发现我想使用这些和其他常见的数据库功能,因此无论如何都必须直接进行一些数据库配置.
我发现在DB中首先生成的默认POCO类非常干净,但缺少非常有用的数据注释属性或映射到存储过程.我使用T4模板来克服其中一些限制.T4模板非常棒,特别是与您自己的元数据和部分类结合使用时.
模型首先似乎有很大的潜力,但在复杂的数据库模式重构过程中给了我很多错误.不知道为什么.
在SP1之前使用大型模型的速度非常慢,(在SP1之后没有尝试过,但据说现在很容易).
我仍然首先设计我的表,然后内部构建的工具为我生成POCO,因此它需要为每个poco对象执行重复任务的负担.
当您使用源代码控制系统时,您可以轻松地跟踪POCO的历史记录,使用设计器生成的代码并不容易.
我有一个POCO的基础,这使得很多事情变得非常简单.
我有所有表的视图,每个基本视图为我的外键提供基本信息,我的视图POCO来自我的POCO类,这非常有用.
最后我不喜欢设计师.
小智 5
恕我直言,我认为所有模型都有一个很好的地方,但我对模型优先方法的问题是在许多大型企业中,DBA 控制数据库,如果不使用数据库优先方法,您将无法获得构建应用程序的灵活性。我参与了许多项目,在部署方面他们想要完全控制。
因此,尽管我同意所有可能的变化代码优先、模型优先、数据库优先,但您必须考虑实际的生产环境。因此,如果您的系统将成为具有许多用户和 DBA 运行该节目的大型用户群应用程序,那么您可能会考虑数据库第一选项,这只是我的意见。
| 归档时间: |
|
| 查看次数: |
289397 次 |
| 最近记录: |