首先使用Entity Framework代码创建数据库时,可以从代码中提取大量数据库模型。 Fluent API和/或属性可用于微调模型。
与数据注释相比,Fluent Api有哪些优缺点?换句话说:即使在某些情况下可以使用这两种方法,在一种情况下,一种方法应该优先于另一种方法吗?
答案 0 :(得分:131)
使用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>> ...)
编辑:Microsoft将Fluent API视为“高级功能”(引自here):
流畅的API被认为是更多 高级功能,我们会 建议使用数据注释 除非您的要求需要 使用流畅的API。
但是在我看来,你很快就达到了DataAnnotations的限制(除了非常简单的对象模型)。如果您无法再使用DataAnnotations对模型进行微调,则最后的方法是遵循默认的映射约定(根据这些规则命名属性)。目前,您无法覆盖这些约定(仅禁用它们; MS宣布在将来的EF版本中为约定提供配置选项)。但是,如果您不希望在定义对象模型时被映射约定强制,那么您唯一的选择就是Fluent API。
学习Fluent API几乎是必须的,DataAnnotations对于简单的应用程序来说是一个很好的选择。