EDMX图中使用实体框架4.1代码优先优于模型/数据库优先的优点和缺点是什么?

我试图充分理解使用EF 4.1构建数据访问层的所有方法。我使用存储库模式和IoC。

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

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

在这两种情况下,我最终得到的POCO对象是ORM不可知的,而上下文则来自DbContext。

数据库优先似乎是最有吸引力的,因为我可以在企业管理器中设计数据库,快速同步模型并使用设计器对其进行微调。

那么这两种方法有什么不同呢?仅仅是VS2010 vs企业管理器的偏好问题吗?


当前回答

数据库优先和模型优先没有真正的区别。 生成的代码是相同的,您可以结合这两种方法。例如,您可以使用设计器创建数据库,也可以使用sql脚本更改数据库并更新模型。

当你首先使用代码时,你不能在没有重新创建数据库和丢失所有数据的情况下改变模型。恕我直言,这个限制非常严格,不允许在生产中首先使用代码。目前它还不能真正使用。

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

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

我建议使用代码优先的方法,当你创建简单的独立应用程序,没有版本,并使用模型\数据库优先的项目,需要在生产中修改。

其他回答

数据库优先方法示例:

无需编写任何代码: ASP。数据库优先/数据库优先

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

我认为Julie Lerman(《Programming Entity Framework》的作者)所写的这棵简单的“决策树”能够帮助我们更自信地做出决定:

更多信息在这里。

我认为区别在于:

代码首先

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

数据库的第一

Very popular if you have DB designed by DBAs, developed separately or if you have existing DB. You will let EF create entities for you and after modification of mapping you will generate POCO entities. If you want additional features in POCO entities you must either T4 modify template or use partial classes. Manual changes to the database are possible because the database defines your domain model. You can always update model from database (this feature works quite well). I often use this together VS Database projects (only Premium and Ultimate version).

第一个模型

IMHO popular if you are designer fan (= you don't like writing code or SQL). You will "draw" your model and let workflow generate your database script and T4 template generate your POCO entities. You will lose part of the control on both your entities and database but for small easy projects you will be very productive. If you want additional features in POCO entities you must either T4 modify template or use partial classes. Manual changes to database will be most probably lost because your model defines the database. This works better if you have Database generation power pack installed. It will allow you updating database schema (instead of recreating) or updating database projects in VS.

我希望在EF 4.1的案例中,还有其他几个与代码优先和模型/数据库优先相关的特性。首先在Code中使用的Fluent API并不能提供EDMX的所有功能。我希望像存储过程映射、查询视图、定义视图等功能在首先使用模型/数据库和DbContext(我还没有尝试过)时可以工作,但在代码中不能。

我认为代码优先的优点之一是,你可以备份你对版本控制系统(如Git)所做的所有更改。因为所有的表和关系都存储在本质上只是类中,所以您可以回顾过去,看看数据库以前的结构是什么。

依我之见,我认为所有的模型都有很好的地方,但我认为模型优先方法的问题是,在许多大型企业中,DBA控制数据库,如果不使用数据库优先方法,就无法获得构建应用程序的灵活性。我参与过许多项目,当涉及到部署时,他们想要完全控制。

因此,尽管我同意所有可能的变化,代码优先,模型优先,数据库优先,您必须考虑实际的生产环境。因此,如果您的系统将是一个拥有许多用户和DBA的大型用户基础应用程序,那么您可能会考虑数据库作为首选——这只是我的观点。