Har*_*lse 11 c# entity-framework dbcontext
有时使用Entity Framework Code First时,默认约定不会创建所需的数据库类型.例如,默认情况下,type属性System.DateTime会创建一个类型的数据库列DateTime.如果您希望它具有某种类型datetime2(DateTime时区和夏令时没有问题的类型)该怎么办?
可以使用a指定数据注释所需的数据库类型DataTypeAtrribute.DataTypeAttribute的构造函数之一接受参数DataType Enumeration.所以可以指定类似的东西:
[DataType(DataType.DateTime)]
public DateTime DateOfBirth {get; set;}
Run Code Online (Sandbox Code Playgroud)
DataType枚举类型包含许多类型,但它缺少值DateTime2.
另一种方法是使用Fluent API.创建一个DateTime2in方法DBContext.OnModelCreating:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Student>().Property(p => p.BirthDate)
.HasColumnType("datetime2");
}
Run Code Online (Sandbox Code Playgroud)
DataTypeAttribute有第二个接受字符串的构造函数.该字符串定义为
要与数据字段关联的自定义字段模板的名称.
因此可以假设以下内容足以创建datetime2:
[DataType("datetime2")]
public DateTime DateOfBirth {get; set;}
Run Code Online (Sandbox Code Playgroud)
唉,这不起作用.创建的列仍具有DateTime格式.
问题:在构造函数中使用哪个字符串来创建datetime2?
Cod*_*ter 24
DataType属性不用于Code First的列类型映射:
Column注释更擅长指定映射列的属性.您可以规定名称,数据类型甚至列在表格中的显示顺序.[...]不要将Column的TypeName属性与DataType DataAnnotation混淆.DataType是用于UI的注释,首先被代码忽略.
所以:
[Column(TypeName="datetime2")]
Run Code Online (Sandbox Code Playgroud)
Har*_*lse 10
对于那些仍然对如何定义属性的列类型感兴趣的人.从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));
}
Run Code Online (Sandbox Code Playgroud)