3.1 建立模型-實體屬性
阿新 • • 發佈:2020-07-22
屬性的優先順序
特性(稱為資料註釋)應用於類和屬性。 資料註釋會替代約定,但會被 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)
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");
}