首先使用Entity Framework代码创建数据库时,可以从代码中提取很多数据库模型。流利的API和/或属性可用于微调模型。
与数据注释相比,Fluent Api有哪些优缺点?换句话说:即使在某些情况下两种方法都可以使用,在哪种情况下应优先使用另一种方法?
首先使用Entity Framework代码创建数据库时,可以从代码中提取很多数据库模型。流利的API和/或属性可用于微调模型。
与数据注释相比,Fluent Api有哪些优缺点?换句话说:即使在某些情况下两种方法都可以使用,在哪种情况下应优先使用另一种方法?
Answers:
Fluent API也可以使用DataAnnotations配置所有内容。反之则不成立。因此,从配置选项和灵活性的角度来看,Fluent API“更好”。
可以在Fluent API中使用配置示例(确保不是完整列表),但不能与DataAnnotations一起使用(据我所知):
关闭级联删除:
.WillCascadeOnDelete(false)
当您的对象模型中没有公开键时,在数据库中指定外键列名:
.Map(conf => conf.MapKey("MyForeignKeyID"))
精细的关系微调,尤其是在对象模型中仅显示关联的一侧的所有情况下:
.WithMany(...)
,WithOptional(...)
,WithRequiredDependent(...)
,WithRequiredPrincipal(...)
对象模型和数据库表之间的继承映射的规范(逐层表,逐类型表,逐具体表类):
.Map<TDerived>(Action<EntityMappingConfiguration<TDerived>> ...)
编辑:Microsoft将Fluent API视为“高级功能”(从此处引用):
fluent API被认为是更高级的功能,除非您的要求要求您使用fluent API,否则我们建议您使用数据注释。
但是在我看来,您很快就会达到DataAnnotations的局限性(也许对于极其简单的对象模型除外)。如果您再也无法使用DataAnnotations来微调模型,那么您最后的选择就是遵循默认的映射约定(通过根据这些规则命名属性)。当前,您不能覆盖这些约定(只能禁用它们; MS宣布在将来的EF版本中提供这些约定的配置选项)。但是,如果在定义对象模型时不想被映射约定强加,那么唯一的选择就是Fluent API。
学习Fluent API几乎是必须的,DataAnnotations是简单应用程序的必备工具。
[Required]
属性放在ASP.NET MVC应用程序中的属性上,则EF 和 MVC 都会将其用于验证目的,因为两者都可以处理此属性。但是MVC无法理解Fluent API配置。因此,如果删除该属性并HasRequired
改为在Fluent API中使用,则对于EF,它是相同的,但对于MVC,则不是。(我认为属性应该以不同的方式命名,来自不同组件且出于不同目的使用DataAnnotations命名空间非常令人困惑。)
[DefaultValue()]
,Fluent Either中不可能。
Fluent API
这将使您的实现逻辑DbContext
保持在您的头脑中,并使您保持POCO
整洁