[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; } }
一對一關聯
{ // 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; } }產出資料表如下圖:
若沒有定義 Identity 欄位,EF 自己也會產生出 Identity_Id,如下圖:
透過下列類別的定義可以看出,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; } }資料表關聯如下圖:
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 就會自動幫我們產生出多對多的關聯表
除了定義類別之外,還必須要實作 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