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

当使用实体框架代码创建数据库时,可以从代码中提取大量数据库模型。可以使用流畅的 API 和/或 Attritribute 对模型进行微调。

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

46153 次浏览

使用 FluentAPI 也可以使用 DataAnnotations 配置任何内容。反之则不然。因此,从配置选项和灵活性的角度来看,FluentAPI 是“更好的”。

在 Fluent API 中可以使用的配置示例(当然不是完整的列表) ,但是在 DataAnnotions 中不可以使用(就我所见) :

  • 关闭级联删除:

    .WillCascadeOnDelete(false)

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

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

  • 关系的细粒度调优,特别是在对象模型中只暴露关联的一个方面的所有情况下:

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

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

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

编辑: 微软认为 Fluent API 是一个“高级特性”(引自 给你) :

流畅的 API 被认为是 先进的功能,我们将 建议使用数据注释 除非你有需要 使用流畅的 API。

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

学习 Fluent API 几乎是必须的,DataAnnotions 对于简单的应用程序来说是一个很好的选择。