C# 实体框架代码优先:DateTime2的哪个数据类型属性?

C# 实体框架代码优先:DateTime2的哪个数据类型属性?,c#,entity-framework,dbcontext,C#,Entity Framework,Dbcontext,有时,当首先使用实体框架代码时,默认约定不会创建所需的数据库类型。例如,默认情况下,类型为System.DateTime的属性创建类型为DateTime的数据库列。如果您希望它的类型为DateTime 2(时区和夏令时没有问题的DateTime类型),该怎么办 可以使用datatypeatribute使用数据注释指定所需的数据库类型。的构造函数之一接受一个参数。因此可以指定如下内容: [DataType(DataType.DateTime)] public DateTime DateOfBirt

有时,当首先使用实体框架代码时,默认约定不会创建所需的数据库类型。例如,默认情况下,类型为
System.DateTime
的属性创建类型为
DateTime
的数据库列。如果您希望它的类型为
DateTime 2
(时区和夏令时没有问题的
DateTime
类型),该怎么办

可以使用
datatypeatribute
使用数据注释指定所需的数据库类型。的构造函数之一接受一个参数。因此可以指定如下内容:

[DataType(DataType.DateTime)]
public DateTime DateOfBirth {get; set;}
数据类型枚举类型包含许多类型,但是它缺少
DateTime2
的值

另一种方法是使用fluentapi。在方法中创建一个
DateTime2

唉,这行不通。创建的列仍然具有
DateTime
格式

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

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

因此:


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

这是在
DbContext.OnModelCreating
中使用完成的

如果这样做,就不必为每个DateTime编写属性或fluent 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));
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
//DateTime类型的每个属性都应具有“datetime2”列类型:
modelBuilder.Properties()
.Configure(property=>property.HasColumnType(“datetime2”);
//decimal类型的每个属性的精度应为19
//以及8分制:
modelBuilder.Properties()
.Configure(property=>property.HasPrecision(19,8));
}

我认为对于EF的更高版本,您可能需要使用property的复数形式:modelBuilder.Properties().Configure(property=>property.HasColumnType(“datetime2”);谢谢emp的评论。更新了我的答案以反映这一点。如何在datetime2类型中定义精度。
[DataType("datetime2")]
public DateTime DateOfBirth {get; set;}
[Column(TypeName="datetime2")] 
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));
}