1. 程式人生 > >ASP.NET沒有魔法——ASP.NET MVC 與數據庫之EF實體類與數據庫結構

ASP.NET沒有魔法——ASP.NET MVC 與數據庫之EF實體類與數據庫結構

類之間的關系 context 模型 rst 例子 style 方法 eid 一個

  大家都知道在關系型數據庫中每張表的每個字段都會有自己的屬性,如:數據類型、長度、是否為空、主外鍵、索引以及表與表之間的關系。但對於C#編寫的類來說,它的屬性只有一個數據類型和類與類之間的關系,但是在My Blog中並沒有對它們之間進行過任何的配置,My Blog可以使用已有的數據庫運行,在後續為Post類型添加新屬性時,新屬性也能夠正確的添加到數據庫表中,以下是MySQL的數據庫表結構:

  技術分享

  其中IsPublish和ClickCount是後續通過EF Mirgations添加的。下圖的表是直接通過EF根據Post類創建的,可以看出它們部分數據類型是不一樣的,自己創建的數據庫Title等字段用的是varchar而EF創建的是longtext:

  技術分享

關於EF code first約定 

  約定(Conventions)是一個在使用EF Code First時根據實體類型自動配置一個“概念模型”的規則集合,這裏的“概念模型”就可以理解為數據庫表模型。它們位於System.Data.Entity.ModelConfiguration.Conventions 命名空間。以下是一些常用的約定:
  ● 關於ID的約定(主鍵約定):類型中以ID命名的或者命名以ID結尾的,如ID或PostID。如果類型為數字或者GUID那麽將會被認為是Identity列。
  ● 關於類關系的約定(表之間的外鍵約定

):使用導航屬性(既該屬性是另一個實體類型)來判斷類與類之間的一對一、一對多和多對多關系。

  以下是微軟文檔例子:

技術分享
 1 public class Department 
 2 { 
 3     // 主鍵 
 4     public int DepartmentID { get; set; } 
 5     public string Name { get; set; } 
 6  
 7     // 導航屬性 
 8     public virtual ICollection<Course> Courses { get; set; } 
 9 } 
10 11 public class Course 12 { 13 // 主鍵 14 public int CourseID { get; set; } 15 16 public string Title { get; set; } 17 public int Credits { get; set; } 18 19 // 外鍵(主表主鍵名稱) 20 public int DepartmentID { get; set; } 21 22 // 導航屬性 23 public virtual Department Department { get; set; } 24 }
View Code  

  在依賴的類型中建議添加一個外鍵屬性,以下幾種寫法會被認為是外鍵屬性(大小寫不敏感):
  ○ 導航屬性名稱+主表主鍵名稱
  ○ 主類名稱+主鍵名稱
  ○ 主表主鍵名稱

  註:如果外鍵屬性是不可為空類型,那麽EF會建立一個關聯刪除,當主鍵記錄被刪除時,關聯的外鍵記錄也會被刪除。
  如果“導航屬性”的類型中不存在主鍵,那麽會被認為是一個復雜類型。
  更多參考文檔:
  https://msdn.microsoft.com/en-us/library/jj679962(v=vs.113).aspx
  https://msdn.microsoft.com/library/system.data.entity.modelconfiguration.conventions.aspx

通過Fluent API來修改屬性和關系

  除了默認的約定外還可以使用特性在對應的實體屬性上面標記和通過EF的Fluent API來進行配置實現關系、屬性的修改。
  本系列文章以Code First為主,所以對於實體與數據庫之間關系的映射也將使用代碼的方式通過Fluent API來介紹。
  Code First Fluent API一般是繼承DbContext並重寫OnModelCreating方法,在OnModelCreating方法中通過modelBuilder來配置對應的實體信息:

  技術分享

  ● 添加主鍵:

  技術分享

  ● 設置列屬性:

  技術分享

  ● 創建索引(EF6.1版本支持)

  技術分享  

  更多設置參考:https://msdn.microsoft.com/en-us/library/jj591617(v=vs.113).aspx
  使用Fluent API處理關系參考:https://msdn.microsoft.com/en-us/library/jj591620(v=vs.113).aspx

使用數據特性標記修改屬性和關系

  除了使用Fluent API來修改實體與數據庫表的映射外,還可以使用數據特性標記的方式實現對類型與數據庫表之間的關系和字段屬性,但是這樣做會對實體代碼有入侵,實體代碼應該是幹凈的與EF和數據庫屬性無關的。

  關於如何使用特性來修改屬性和關系可參考文檔:https://msdn.microsoft.com/en-us/library/jj591583(v=vs.113).aspx

小結:
  本章介紹了實體與數據庫結構之間的關系如何處理,並對主要API進行了介紹,但由於目前My Blog中數據庫結構比較簡單無法完全演示,所以更多使用方法可以參考微軟文檔。

參考:

  https://msdn.microsoft.com/en-us/library/jj679962(v=vs.113).aspx
  https://msdn.microsoft.com/library/system.data.entity.modelconfiguration.conventions.aspx
  https://msdn.microsoft.com/en-us/library/jj591617(v=vs.113).aspx
  https://msdn.microsoft.com/en-us/library/jj591620(v=vs.113).aspx

本文地址:http://www.cnblogs.com/selimsong/p/7656674.html

ASP.NET沒有魔法——目錄

ASP.NET沒有魔法——ASP.NET MVC 與數據庫之EF實體類與數據庫結構