属性的优先级
特性(称为数据注释)应用于类和属性。 数据注释会替代约定,但会被 Fluent API 配置替代,也就是OnModelCreating 里面的等级最高; 下面的例子一般会使用两种模式都写一遍;
修改字段数据类型
比如今天写了2个byte类型的字段,需要把字段属性修改为 tinyint 还是需要修改的
//注解模式
public class Blog
{
public int BlogId { get; set; }
[Column(TypeName = "varchar(200)")]
public string Url { get; set; }
[Column(TypeName = "decimal(5, 2)")]
public decimal Rating { get; set; }
}
// Fluent API模式
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>(eb =>
{
eb.Property(b => b.Url).HasColumnType("varchar(200)");
eb.Property(b => b.Rating).HasColumnType("decimal(5, 2)");
});
}
修改列的默认值
在关系数据库中,可以使用默认值来配置列;如果插入的行没有该列的值,将使用默认值。
可以在属性上配置默认值:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.Property(b => b.Rating)
.HasDefaultValue(3);
}
修改列的最大长度
public class Blog
{
public int BlogId { get; set; }
[MaxLength(500)]
public string Url { get; set; }
}
//API模式修改
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.Property(b => b.Url)
.HasMaxLength(500);
}
精度和小数位
于 decimal
属性,精度定义表示列将包含的任何值所需的最大位数,而 scale 定义所需的最大小数位数。 对于 DateTime
属性,精度定义表示秒的小数部分所需的最大位数,并且不使用小数位数
在将数据传递给提供程序之前,实体框架不会进行任何精度验证或缩放。 根据需要验证提供程序或数据存储。 例如,如果以 SQL Server 为目标,则数据类型为的列
datetime
不允许设置精度,而一个列的datetime2
精度介于0到7(含)之间。
在下面的示例中, Score
将属性配置为具有精度14和小数位数2将导致 decimal(14,2)
在 SQL Server 上创建类型为的列,并且 LastUpdated
将属性配置为具有精度3将导致类型为的列 datetime2(3)
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.Property(b => b.Score)
.HasPrecision(14, 2);
modelBuilder.Entity<Blog>()
.Property(b => b.LastUpdated)
.HasPrecision(3);
}
必需属性和可选属性
按照约定,把可以包含null值的列定义为可选列,不允许包含null值的定为必填列;
比如 int ,bool decimal 都是必须填列;
//注解模式
public class Blog
{
public int BlogId { get; set; }
[Required]
public string Url { get; set; }
}
// API模式
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.Property(b => b.Url)
.IsRequired();
}
另外还有? 为null的引用类型不关注。
包含和排除属性
//注解模式
public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
[NotMapped]
public DateTime LoadedFromDatabase { get; set; }
}
//API 模式
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.Ignore(b => b.LoadedFromDatabase);
}
给列起别名
按照约定,使用关系型数据库的时候,实体属性映射到与属性同名的表列。若是希望使用不同的名称配置列,可以使用下面的代码片段
//注解模式
public class Blog
{
[Column("blog_id")]
public int BlogId { get; set; }
public string Url { get; set; }
}
//API 模式
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.Property(b => b.BlogId)
.HasColumnName("blog_id");
}