繁体   English   中英

实体框架代码优先:DateTime2的DataType属性是什么?

[英]Entity Framework Code First: which DataType attribute for DateTime2?

有时使用Entity Framework Code First时,默认约定不会创建所需的数据库类型。 例如,默认情况下, System.DateTime类型的属性会创建DateTime类型的数据库列。 如果您希望它具有datetime2类型( DateTime类型对时区和夏令时没有问题)该怎么办?

可以使用DataTypeAtrribute使用Data Annotations指定所需的数据库类型。 DataTypeAttribute的构造函数之一接受参数DataType Enumeration 所以可以指定类似的东西:

[DataType(DataType.DateTime)]
public DateTime DateOfBirth {get; set;}

DataType枚举类型包含许多类型,但它缺少DateTime2的值。

另一种方法是使用Fluent API。 在方法DBContext.OnModelCreating中创建DateTime2

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Student>().Property(p => p.BirthDate)
        .HasColumnType("datetime2");
}

DataTypeAttribute有第二个接受字符串的构造函数 该字符串定义为

要与数据字段关联的自定义字段模板的名称。

因此可以假设以下内容足以创建datetime2:

[DataType("datetime2")]
public DateTime DateOfBirth {get; set;}

唉,这不起作用。 创建的列仍具有DateTime格式。

问题 :在构造函数中使用哪个字符串来创建datetime2?

DataType属性不用于Code First的列类型映射

Column注释更擅长指定映射列的属性。 您可以规定名称,数据类型甚至列在表格中的显示顺序。 [...]不要将Column的TypeName属性与DataType DataAnnotation混淆。 DataType是用于UI的注释,首先被代码忽略

所以:

[Column(TypeName="datetime2")] 

对于那些仍然对如何定义属性的列类型感兴趣的人。 从EF 6.0版开始,您可以定义某些类型的每个值都应具有某种数据库类型。

这是在做DbContext.OnModelCreating使用DbModelBuilder.Properties

如果这样做,则不必为每个DateTime编写属性或流畅的API。 更容易保持一致,并让所有DateTime具有相同的列类型。 类似地,即使将来添加小数,您也可以给所有小数提供相同的精度。

假设您要定义每个System.DateTime应该具有列类型DateTime2 ; 每个System.Decimal都应该具有指定精度的列类型。 在DbContext中你会写:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    // every property of type DateTime should have a column type of "datetime2":
    modelBuilder.Properties<DateTime>()
      .Configure(property => property.HasColumnType("datetime2"));
    // every property of type decimal should have a precision of 19
    // and a scale of 8:
    modelBuilder.Properties<decimal>()
        .Configure(property => property.HasPrecision(19, 8));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM