EDMX图中使用实体框架4.1代码优先优于模型/数据库优先的优点和缺点是什么?
我试图充分理解使用EF 4.1构建数据访问层的所有方法。我使用存储库模式和IoC。
我知道我可以使用代码优先的方法:手动定义实体和上下文,并使用ModelBuilder对模式进行微调。
我还可以创建一个EDMX图并选择一个代码生成步骤,该步骤使用T4模板来生成相同的POCO类。
在这两种情况下,我最终得到的POCO对象是ORM不可知的,而上下文则来自DbContext。
数据库优先似乎是最有吸引力的,因为我可以在企业管理器中设计数据库,快速同步模型并使用设计器对其进行微调。
那么这两种方法有什么不同呢?仅仅是VS2010 vs企业管理器的偏好问题吗?
我认为区别在于:
代码首先
非常流行,因为核心程序员不喜欢任何类型的设计器,并且在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(我还没有尝试过)时可以工作,但在代码中不能。
代码优先似乎是后起之秀。我快速浏览了Ruby on Rails,他们的标准是代码优先,带有数据库迁移。
如果您正在构建一个MVC3应用程序,我认为Code首先具有以下优点:
Easy attribute decoration - You can decorate fields with validation, require, etc.. attributes, it's quite awkward with EF modelling
No weird modelling errors - EF modelling often has weird errors, such as when you try to rename an association property, it needs to match the underlying meta-data - very inflexible.
Not awkward to merge - When using code version control tools such as mercurial, merging .edmx files is a pain. You're a programmer used to C#, and there you are merging a .edmx. Not so with code-first.
Contrast back to Code first and you have complete control without all the hidden complexities and unknowns to deal with.
I recommend you use the Package Manager command line tool, don't even use the graphical tools to add a new controller to scaffold views.
DB-Migrations - Then you can also Enable-Migrations. This is so powerful. You make changes to your model in code, and then the framework can keep track of schema changes, so you can seamlessly deploy upgrades, with schema versions automatically upgraded (and downgraded if required). (Not sure, but this probably does work with model-first too)
更新
这个问题还要求比较代码优先和EDMX模型/db优先。代码优先也可以用于以下两种方法:
模型优先:首先对poco编码(概念模型),然后生成数据库(迁移);或
数据库优先:给定一个现有数据库,手动对poco进行编码以匹配。(不同之处在于poco不是在现有数据库的情况下自动生成的)。您可以使用生成POCO类,并使用实体框架或实体框架5 -如何从现有数据库生成POCO类来映射现有数据库。
在SP1之前,使用大型机型的速度非常慢(SP1之后还没有尝试过,但据说现在很容易)。
我仍然先设计我的表,然后内部构建的工具为我生成poco,因此它承担了为每个poco对象执行重复任务的负担。
当你使用源代码控制系统时,你可以很容易地跟踪poco的历史,而使用设计器生成的代码就不那么容易了。
我的POCO有一个基础,这使得很多事情变得非常简单。
我有所有表的视图,每个基本视图为外键带来基本信息,我的视图POCO派生自我的POCO类,这是非常有用的。
最后,我不喜欢设计师。