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

Sam*_*Sam 107 entity-framework ef-fluent-api

在使用Entity Framework代码优先创建数据库时,可以从代码中提取许多数据库模型.Fluent API和/或Attributes可用于微调模型.

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

Sla*_*uma 133

使用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视为"高级功能"(引自此处):

流畅的API被认为是更高级的功能,我们建议使用数据注释,除非您的要求要求您使用流畅的API.

但在我看来,你很快就达到了DataAnnotations的限制(除非是非常简单的对象模型).如果您无法再使用DataAnnotations对模型进行微调,则最后的方法是遵循默认的映射约定(根据这些规则命名属性).目前,您无法覆盖这些约定(仅禁用它们; MS宣布在将来的EF版本中为约定提供配置选项).但是,如果您不希望在定义对象模型时被映射约定强制,那么您唯一的选择就是Fluent API.

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

  • @CounterTerrorist:我不这么认为.例如:如果在ASP.NET MVC应用程序中的属性上放置`[Required]`属性,它将由EF*和*MVC用于验证目的,因为它们都可以处理此属性.但是MVC不会理解Fluent API配置.因此,如果删除该属性并在Fluent API中使用"HasRequired",对于EF,它将是相同的但不适用于MVC.(在我看来,属性应该以不同的名称命名,从不同组件和不同目的使用DataAnnotations命名空间非常混乱.) (23认同)
  • 从架构的角度来看,我想`Fluent API`会将你的实现逻辑保留在你的'DbContext`中并保持你的'POCO'清洁 (6认同)
  • 我是这个领域的新手.可以使用Fluent API来验证用户界面,因为DataAnnotation可以做到吗? (2认同)
  • 另请注意,Fluent Either中无法使用`[DefaultValue()]`. (2认同)
  • MinValue是一个无法通过Fluent API(编程实体框架:代码优先)定义的属性(来源:[The Cog]删除NAA(/sf/users/72541171/)) (2认同)
  • 属性具有的优点是,每个实体都将每个属性的设置封装在该实体本身内。超级干净的.sql脚本可以正式设计您的数据库,并反向工程具有属性的类文件;也绕过迁移。 (2认同)
  • @斯劳玛;对于简单的 CRUD 应用程序,是的,但从技术上讲,您不应该将域类型暴露给 Web 前端,而应使用 DTO 或 MVC 模型来应用属性。 (2认同)