[DataType(DataType. emailaddress)]在fluent api中有对应的部分吗?

本文关键字:DataType api emailaddress fluent | 更新日期: 2023-09-27 18:09:39

如果没记错的话,Fluent api中[DataType(DataType.Currency)]的DataAnnotation对应部分是modelBuilder.Entity<T>.Property(i => i.Price).HasColumnType("Currency")

那么[DataType(DataType.EmaillAddress)]的对应部分是多少?

或者有一个网站有一个if-you-can-do-in-data-annotation-you-can-do- in-fluent api列表。因为我想用Fluent Api做验证和映射。由于

[DataType(DataType. emailaddress)]在fluent api中有对应的部分吗?

这是一个众所周知的令人困惑的领域。

关于你的例子:

  • [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,这些位更有可能改变。