在流畅的api中有一个计数器部分吗?

如果没有弄错,Fluent api中[DataType(DataType.Currency)]的DataAnnotation的计数器部分是modelBuilder.Entity.Property(i => i.Price).HasColumnType("Currency")

那么[DataType(DataType.EmaillAddress)]的计数器部分是什么?

或者是否有一个网站,其中包含一个可以在数据中进行注释的列表 – 您可以在流利的api中进行操作。 因为我想使用Fluent Api进行validation和映射。 谢谢

这是一个众所周知的混乱区域。

关于你的例子:

  • [DataType(DataType.Currency)]注释的属性实现为decimal(18,2) (在Sql Server中)。 关闭
  • 流畅的映射HasColumnType("Money") (而不是“Currency”)将列创建为Money数据类型。 完美的搭配。
  • [DataType(DataType.EmailAddress)]注释的字符串属性将创建为nvarchar(max) 。 当然,这对于电子邮件地址来说已经足够了。 但它不是一种强制执行特定格式的数据类型。

当然EF可以做得更好,不是吗? 那么,在后一种情况下,它该怎么办? 没有内置的电子邮件数据类型,我认为我们不能指望EF使用规则和所有动态创建用户定义的类型(更不用说Sql Server中的规则已被弃用)。

令人困惑的部分是数据注释被不同的框架使用不同,如这里所解释的。

我不确定EF团队是否通过在代码优先实现一部分注释做出了正确的决定。 当然,它们无法在广泛的System.ComponentModel.DataAnnotations命名空间中实现所有属性。 但目前的实施充其量只是半心半意。 上面的例子只是一个小例子 – 一个注释被实现,另一个没有。 而且,就此而言,EF很乐意允许您将int属性注释为EmailAddress

因此,要回答您的问题, DataType.EmailAddress没有流畅的对应物。 没有什么可以对应的。

另一方面,要为EF说话,根本没有实现注释会迫使我们做多余的事情。 如果我们一起使用MVC和EF,注释可以应用一次,并且两个系统都很好地兼容。 使注释和流畅的配置匹配将是一项繁琐的工作。

不幸的是,我找不到任何披露注释和流畅API之间完整映射的来源。 也许这是最糟糕的部分:我们必须通过反复试验找出答案。 有谁在那里开导我们?

我认为你的第一个例子是巧合, DataType注释用于指定更合适的CLR类型。 与数据库完全无关,因为它也可以在序列化时使用

HasColumnType显然适用于数据库,我认为这是因为EF做出错误选择,节省空间的问题,或者您将自己的自定义类型添加到数据库中。

在我自己的工作中,我已经遵循了我可以使用注释的规则,只要它们在ComponentModel.DataAnnotations命名空间中,其他任何东西(可能是EF特定的)都是通过Fluent完成的,因为这些更有可能如果使用不同的ORM则更改。