在使用实体框架代码优先创建数据库时,可以从代码中提取很多数据库模型。Fluent API 和/或属性可用于微调模型。
与 Data Annotations 相比,Fluent Api 的优缺点是什么?换句话说:即使在某些情况下两种方法都可以使用,在什么情况下一种方法应该优于另一种方法?
在使用实体框架代码优先创建数据库时,可以从代码中提取很多数据库模型。Fluent API 和/或属性可用于微调模型。
与 Data Annotations 相比,Fluent Api 的优缺点是什么?换句话说:即使在某些情况下两种方法都可以使用,在什么情况下一种方法应该优于另一种方法?
您可以使用 DataAnnotations 配置的所有内容也可以使用 Fluent API 实现。反过来是不正确的。因此,从配置选项和灵活性的角度来看,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。
但在我看来,您很快就会达到 DataAnnotations 的限制(可能非常简单的对象模型除外)。如果您不能再使用 DataAnnotations 微调您的模型,您最后的手段是遵循默认映射约定(通过根据这些规则命名您的属性)。目前您不能覆盖约定(只能禁用它们;MS 宣布在未来的 EF 版本中为约定提供配置选项)。但是,如果您不想在定义对象模型时受映射约定的约束,那么您唯一的选择就是 Fluent API。
学习 Fluent API 几乎是必须的恕我直言,DataAnnotations 对于简单的应用程序来说是一个不错的选择。