資料庫表之間有一對一 一對多 多對多關係。那同樣,CodeFirst也要能分析這些類之間的這些關係。CodeFirst可以自動通過分析類之間的屬性導航屬性 從而得出類之間的關係,自動確定外鍵。一對多一對多是最為常見的一種關係,符合怎樣的規範會被CodeFirst識別為一對多的關係呢? publ...
資料庫表之間有一對一 一對多 多對多關係。那同樣,CodeFirst也要能分析這些類之間的這些關係。 CodeFirst可以自動通過分析類之間的屬性導航屬性 從而得出類之間的關係,自動確定外鍵。
一對多 一對多是最為常見的一種關係,符合怎樣的規範會被CodeFirst識別為一對多的關係呢?
public class Blog { public string ID { get; set; } public string BlogName { get; set; } public string BlogAuthor { get; set; } public virtual List <Post> Posts { get; set ; } //導航屬性 public virtual List <Article> Articles { get; set; } //導航屬性 [ Timestamp] public byte [] version { get; set; } } public class Post { public string ID { get; set; } public string PostName { get; set; } public string Content { get; set; } public virtual Blog BelongBlog { get; set; } //導航屬性 } public class Article { public string ID { get; set; } public string ArticleName { get; set; } public string Content { get; set; } }CodeFirst發現 Blog中有兩個集合導航屬性,Post中也有一個Blog類型的引用屬性,分析出Blog和 Post以及Article之間都存在一對多的關係。 我們還可以發現 Article中並沒有 Blog類型的導航屬性,並且 Post和Article生成的主鍵名稱不一樣。 其實EF推斷兩個類之間存在一堆多的關係,只需要 兩個類中的其中一個存在指向另一個類的導航屬性即可。 並且 外鍵名稱的生成規則是 首先是 導航屬性名稱+ 下劃線_ +ID 如果導航屬性不存在 那就是 另一個類的類名+ID 存在顯示的符合規範的外鍵 有些時候就是手賤,喜歡手動寫上外鍵,那麼屬性名稱符合什麼樣的規範會被CodeFirst識別為外鍵,而不是一般屬性呢?(當然前提是已經存在導航屬性) 當屬性符合 [目標類型的鍵名],[目標類型名稱]+[目標類型鍵名稱],或[導航屬性名稱]+[目標類型鍵名稱]的形式的時候,會被判定為外鍵。 當兩個類之間存在多個關係時會怎樣呢?在Post類中,有可能需要跟蹤誰創建了它,以及誰編輯了它。那麼Post類就需要增加兩個導航屬性
public Person CreatedBy { get; set; } public Person UpdatedBy { get; set; }那同樣在我們的Person類之中,也需要加上兩個屬性,一個屬性指向這個人創建的所有文章,另一個屬性指向之個人更新的所有文章。
public virtual List<Post> PostsWritten { get; set; } public virtual List <Post> PostsUpdated { get; set ; }會發現這時候生成了四個外鍵,這是因為當類之間存在多個關係的時候,EF是無法準確分辨的,需要我們手動的添加代碼來幫助EF分析。要想解決這個問題 就要用另一個數據註釋 : InverseProperty 代碼贏改成如下
[InverseProperty( "CreatedBy")] public virtual List <Post> PostsWritten { get; set ; } [ InverseProperty("UpdatedBy" )] public virtual List <Post> PostsUpdated { get; set ; }要註意 InverseProperty括弧內的名稱是要與另一個類的相關的導航屬性名稱相匹配的,否則會報錯。 這個時候資料庫外鍵就正確了
多對多 如果兩個類之間,各自都有集合導航屬性指向對方,那這兩個類之間的關鍵會被識別為多對多關係。
public class Student { public int StudentID { get; set; } public string Name { get; set; } public List <Course> Courses { get; set ; } } public class Course { public int CourseID { get; set; } public string CourseName { get; set; } public List <Student> Students { get; set ; } }學生可以選擇多門課程,每門課也有很多學生,這樣的多對對關係,codefirst會自動生成第三張表,表裡存放另外兩張表的主鍵作為外鍵存放。
一對一
在一對一和一對多的關係之後,我們回頭再來講一對一的關係。 如果需要將兩個類之間的關係配置為一對一的關係,那麼需要兩個類互相有指向對方的引用屬性
public class Book { public int BookID { get; set; } public string Name { get; set; } public BookCover Cover { get; set; } } public class BookCover { [ Key , ForeignKey ("Coverof" )] public int BookID { get; set; } public byte [] Photo { get; set; } public Book Coverof { get; set; } }並且兩個類的主鍵要是一樣的,而且為了確認其中一個為關係中的依賴主體,必須用ForeignKey指明,也就是上面的BookCover表的BookID既是外鍵也必須是主鍵。否則會報錯。 關係就講到這裡,如果喜歡就 推薦一下吧~ O(∩_∩)O