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

时间:2011-03-18 16:22:20

标签: entity-framework ef-fluent-api

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

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

1 个答案:

答案 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对于简单的应用程序来说是一个很好的选择。