实体框架代码优先-Fluent Api与数据注释的优缺点


118

首先使用Entity Framework代码创建数据库时,可以从代码中提取很多数据库模型。流利的API和/或属性可用于微调模型。

与数据注释相比,Fluent Api有哪些优缺点?换句话说:即使在某些情况下两种方法都可以使用,在哪种情况下应优先使用另一种方法?


3
只是一个想法:我通常要做的是用我的POCO创建一个Model项目,然后在Repository项目中,创建一组专门用于EF的新POCO,并将我的注释放在那里。然后,我仅在mapper类中的两者之间进行映射。这样,我的模型将保持不变,并在必要时使其易于添加/更改我的数据策略(例如,添加XmlRepository并使用相同的Model类)。
adimauro 2011年

1
我现在更喜欢带有EFCore和其他库的注释。(需要更少的代码,并且所有操作都集中在一个地方)github.com/isukces/EfCore.Shaman-添加和扩展属性github.com/borisdj/EFCore.FluentApiToAnnotation-在执行逆向工程并切换到CodeFirst
borisdj

Answers:


140

Fluent API也可以使用DataAnnotations配置所有内容。反之则不成立。因此,从配置选项和灵活性的角度来看,Fluent API“更好”。

可以在Fluent API中使用配置示例(确保不是完整列表),但不能与DataAnnotations一起使用(据我所知):

  • 关闭级联删除:

    .WillCascadeOnDelete(false)

  • 当您的对象模型中没有公开键时,在数据库中指定外键列名:

    .Map(conf => conf.MapKey("MyForeignKeyID"))

  • 精细的关系微调,尤其是在对象模型中仅显示关联的一侧的所有情况下:

    .WithMany(...)WithOptional(...)WithRequiredDependent(...)WithRequiredPrincipal(...)

  • 对象模型和数据库表之间的继承映射的规范(逐层表,逐类型表,逐具体表类):

    .Map<TDerived>(Action<EntityMappingConfiguration<TDerived>> ...)

编辑:Microsoft将Fluent API视为“高级功能”(从此处引用):

fluent API被认为是更高级的功能,除非您的要求要求您使用fluent API,否则我们建议您使用数据注释。

但是在我看来,您很快就会达到DataAnnotations的局限性(也许对于极其简单的对象模型除外)。如果您再也无法使用DataAnnotations来微调模型,那么您最后的选择就是遵循默认的映射约定(通过根据这些规则命名属性)。当前,您不能覆盖这些约定(只能禁用它们; MS宣布在将来的EF版本中提供这些约定的配置选项)。但是,如果在定义对象模型时不想被映射约定强加,那么唯一的选择就是Fluent API。

学习Fluent API几乎是必须的,DataAnnotations是简单应用程序的必备工具。


2
我是这个领域的新手。可以像DataAnnotation一样使用Fluent API来验证用户界面吗?
亲吻我的腋窝,2012年

26
@CounterTerrorist:我不这么认为。例如:如果将[Required]属性放在ASP.NET MVC应用程序中的属性上,则EF MVC 都会将其用于验证目的,因为两者都可以处理此属性。但是MVC无法理解Fluent API配置。因此,如果删除该属性并HasRequired改为在Fluent API中使用,则对于EF,它是相同的,但对于MVC,则不是。(我认为属性应该以不同的方式命名,来自不同组件且出于不同目的使用DataAnnotations命名空间非常令人困惑。)
Slauma 2012年

3
另请注意[DefaultValue()],Fluent Either中不可能。
webnoob 2014年

3
MinValue是无法通过Fluent API(编程实体框架:代码优先)定义的属性(来源:The Cog删除了NAA )
Serge Ballesta 2014年

7
从体系结构的角度来看,我想Fluent API这将使您的实现逻辑DbContext保持在您的头脑中,并使您保持POCO整洁
Luke T O'Brien
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.