[C#.NET][Entity Framework] Code First 預設慣例

[C#.NET][Entity Framework] Code First 預設慣例

預設,當我們定義好類別屬性,EF 就能幫我們產生 SQL 資料表

 

本篇索引

主索引鍵

一對一關聯

一對多關聯

多對多關聯

類型探索

預設連接工廠

 


主索引鍵

當類別的屬性有 Id (不分大小寫)或是後綴詞含有 Id,這個欄位就會變成主索引鍵 PK,若同時有兩個欄位後綴詞帶有 Id,EF 就會自己挑一個來當 PK

當我這樣做的時候,EF 把 Id 當成 PK,如果欄位有多個 Id,那就要特地指定 PK,只要在欄位上加 [Key] 就可以

{
    public int IdentityId { get; set; }

    // Primary key
    public int Id { get; set; }

    public string Account { get; set; }
}

資料表如下圖:
image

一對一關聯
{
    // Primary key
    public int Id { get; set; }

    public string Account { get; set; }
}

 

在 EF 裡 Identity 屬性變成導覽屬性,會將自動將 IdentityId 變成 PK

{
    // Primary key
    public int Id { get; set; }

    public string Name { get; set; }

    public string Address { get; set; }

    // Foreign key
    public int IdentityId { get; set; }

    // Navigation properties
    public virtual Identity Identity { get; set; }
}

 
產出資料表如下圖:
image

 

若沒有定義 Identity 欄位,EF 自己也會產生出 Identity_Id,如下圖:

image

 

一對多關聯

透過下列類別的定義可以看出,Order 可以查到跟自己有關的多筆 OrderDetail

{
    private ICollection<OrderDetail> _orderDetails;

    public int Id { get; set; }

    public string Number { get; set; }

    // Navigation property
    public virtual ICollection<OrderDetail> OrderDetails
    {
        get
        {
            if (this._orderDetails == null)
            {
                this._orderDetails = new HashSet<OrderDetail>();
            }
            return _orderDetails;
        }
        set { _orderDetails = value; }
    }
}

 

反之,OrderDetail 也能知道當下這筆記錄是屬於哪一個 Order

Detail{
    // Primary key
    public int Id { get; set; }

    public string ProductName { get; set; }

    // Foreign key

    public int OrderId { get; set; }

    // Navigation property
    public virtual Order Order { get; set; }
}

 

資料表關聯如下圖:

image

 

多對多關聯

Teacher 類別能查到多筆 Student

{
    private ICollection<Student> _students;

    // Primary key
    public int Id { get; set; }

    public string Name { get; set; }

    // Foreign key
    public int StudentId { get; set; }

    // Navigation property
    public virtual ICollection<Student> Students
    {
        get
        {
            if (this._students == null)
            {
                this._students = new HashSet<Student>();
            }
            return _students;
        }
        set { _students = value; }
    }
}
Student 也能查到多筆 Teacher 
{
    private ICollection<Teacher> _teachers;

    // Primary key
    public int Id { get; set; }

    public string Name { get; set; }

    // Foreign key
    public int TeacherId { get; set; }

    // Navigation property
    public virtual ICollection<Teacher> Teachers
    {
        get
        {
            if (this._teachers == null)
            {
                this._teachers = new HashSet<Teacher>();
            }
            return _teachers;
        }
        set { _teachers = value; }
    }
}

 

EF 就會自動幫我們產生出多對多的關聯表

image

 

類型探索

除了定義類別之外,還必須要實作 DbContext ,並定義 DbSet 屬性,EF就會幫你把 DbSet 屬性變成 SQL 資料表

{
    public DbSet<Identity> Identities { get; set; }

    public DbSet<Employee> Employees { get; set; }

    public DbSet<Order> Orders { get; set; }

    public DbSet<OrderDetail> OrderDetails { get; set; }

    public DbSet<Teacher> Teachers { get; set; }

    public DbSet<Student> Students { get; set; }

    public SystemDbContext()
        : base("localDb")
    {
        
    }
}

 

預設連接工廠

當沒有連接字串加入至內容的組態檔時,才會使用預設連接工廠,這也正是不需要指定任何連線字串EF都能正確工作的原因

  <parameters>
    <parameter value="v11.0" />
  </parameters>
</defaultConnectionFactory>


文章出自:http://www.dotblogs.com.tw/yc421206/archive/2014/03/15/144403.aspx

 

文章參考:

http://msdn.microsoft.com/zh-tw/data/jj679962

http://msdn.microsoft.com/zh-TW/data/jj556606

 

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET

Image result for microsoft+mvp+logo