Entity Framework Code First - Fluent Api与Data Annotations的优缺点

144
在使用Entity Framework的Code First创建数据库时,可以从代码中提取出许多数据库模型。可以使用Fluent API和/或Attributes来微调模型。
相对于数据注释(Data Annotations),Fluent API的优缺点是什么?换句话说,即使在某些情况下两种方法都可以使用,在哪些情况下应该优先选择一种方法而不是另一种方法?

3
一个想法:我通常创建一个包含我的POCO的模型项目,然后在存储库项目中,创建一组专门为EF设计的新的POCO,并将我的注释放在那里。然后我只需在映射器类之间进行映射。这样,我的模型保持不变,如果需要(例如添加XmlRepository并使用相同的模型类),就可以轻松地添加/更改我的数据策略。 - adimauro
1
我现在更喜欢使用注释,结合EFCore和其他库。(这样需要的代码更少,而且所有内容都在一个地方) https://github.com/isukces/EfCore.Shaman - 添加和扩展属性 https://github.com/borisdj/EFCore.FluentApiToAnnotation - 在数据库已经存在时非常有用,在进行反向工程和切换到CodeFirst之后。 - borisdj
1个回答

171
你可以通过Fluent API配置的所有内容也可以在DataAnnotations中实现,但反过来就不一定成立。因此,从配置选项和灵活性的角度来看,Fluent API更好。
以下是Fluent API可以实现但DataAnnotations无法实现(据我所知)的配置示例(当然不是全部):
- 关闭级联删除:.WillCascadeOnDelete(false) - 在数据库中指定外键列名称,当该键在你的对象模型中未公开时:.Map(conf => conf.MapKey("MyForeignKeyID")) - 对关系进行精细调整,特别是在仅暴露关联的一侧的情况下:.WithMany(...), WithOptional(...), WithRequiredDependent(...), WithRequiredPrincipal(...) - 指定对象模型和数据库表之间的继承映射(Table-Per-Hierarchy、Table-Per-Type、Table-Per-Concrete-Class):.Map<TDerived>(Action<EntityMappingConfiguration<TDerived>> ...) 编辑:微软认为Fluent API是一项“高级功能”(摘自这里的引用):
Fluent API 被认为是一项更高级的功能,除非您的要求需要使用 Fluent API,否则我们建议使用 Data Annotations。

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

我认为学习Fluent API几乎是必须的,而DataAnnotations适用于简单的应用程序。


31
@CounterTerrorist: 我不这么认为。例如:如果你在一个ASP.NET MVC应用程序的属性上放置[Required]属性,它将被EF和MVC同时用于验证目的,因为两者都可以处理此属性。但MVC将不理解Fluent API配置。因此,如果你删除属性并在Fluent API中使用HasRequired,对于EF而言是一样的,但对于MVC则不然。(我认为这些属性应该被命名为不同的名称,DataAnnotations命名空间在不同组件和不同目的之间的使用非常令人困惑。) - Slauma
4
请注意,Fluent Either 中不支持 [DefaultValue()] - webnoob
4
MinValue是一个属性,无法通过Fluent API(编程Entity Framework:Code First)进行定义。(来源:由The Cog删除的NAA) - Serge Ballesta
12
从架构角度来看,我认为“Fluent API”会将您的实现逻辑保留在您的“DbContext”中,并保持您的“POCO”干净整洁。 - Luke T O'Brien
3
属性的优点在于每个实体将每个属性的设置封装在该实体本身内部。使用属性来正式设计数据库并反向工程化类文件非常干净利落,还可以避免迁移。 - DeepSpace101
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接