1. 程式人生 > 實用技巧 >3.1 建立模型-實體屬性

3.1 建立模型-實體屬性

屬性的優先順序

特性(稱為資料註釋)應用於類和屬性。 資料註釋會替代約定,但會被 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");
}