Entityframework Core in action是 Jon P smith
所著的關於Entityframework Core 書籍。原版地址. 是除了官方文檔外另外一個學習EF Core的不錯途徑, 書中由淺入深的講解的EF Core的相關知識。由於沒有中文版,因此本人對其進行翻譯。 預計每兩天一篇更新 PS: 翻譯不免限於本人水平有不許確的地方,建議英文水平不錯的同窗直接查看原版,有不足的地方歡迎指正html
在本章中你會構建一個圖書銷售網站示例,稱之爲圖書應用程序. 這個示例應用程序幫助咱們查看查詢中的關係. 本節中介紹了圖書應用程序所需的數據庫與EF Core的實體類部分數據庫
雖然咱們能夠將做者,書,評論等全部數據都放到一張表中,但在關係型數據庫中這樣設計是很糟糕的,關係型數據庫的規範是分離重複的數據,例如做者數據庫設計
咱們有多種方式在數據庫設計圖書數據的各類部分,在本例中的數據庫具備EF Core的主要關係類型,分別是如下三種:工具
一個書能夠有促銷價格,這經過PriceOffers表的一個可選行實現的,這是一個一對一的例子(從技術來說,這是一個1-0或1的關係,不過EF Core的處理方式是同樣的);參見圖2.1學習
The PriceOffers table has a foreign key that links to the books table's primary key網站
EF Core uses its conventions to detect that this is a one-to-one relationship. It therefore adds a unique index to the foreign key to ensure that there can only be one per bookthis
計算圖書的最終價格,須要經過外鍵找到與圖書連接的優惠價格記錄. 若是找到了記錄,NewPrice會取代原書的價格,並將PromotionalText顯示到屏幕上; 例如:翻譯
原價¥40現價¥9.9 溫州印書場倒閉了,老闆帶着小姨子跑路了. 原價都是四十五十的,現價只要九塊九設計
顧客能夠評價一本書;他們能夠評星級,也能夠留文字評論. 由於一本書可能沒有一個評論或者有不少(無限)的評論,因此須要建立一張表保存這些數據. 在本例中它是Review表. Books表與Review表是一對多的關係, 如圖2.2所示3d
The Review table is linked to the Books table via the foreign key called BookId
在顯示圖書介紹時,須要計算評論數量與平均星級評價. 這些經過一對多的關係去檢索. 呈如今頁面上是如下效果:
一書本可能由一我的編寫也可能由多人編寫, 一我的(做者)能夠著做一本書或多本書. 這是一個典型的多對多關係,在數據庫中Books表保存圖書數據,Authors表保存做者. Books和Authors表之間的連接就是多對多關係. 它們之間須要一張中間表. 參見圖2.3
The BookAuthor table is the key to creating the many-to-many relationship and is known as a linking table
This table uses the foreign keys as the primary keys. Because primary keys must be unique, this ensures that only one link can exist between a book and an author
多對多關係的頁面展現以下
EF6: 在EF6中定義多對多關係不須要連接類,EF6會自動建立隱藏的中間表.可是在EF Core中必須本身建立中間表
使用EF Core你可使用繼承達到與以前一對一關係的相似結果,例如你能夠將PriceOffer類繼承自Book類. EF Core會使用第七章中介紹的table-per-hierarchy(TPH)實現. (子類和基類都須要包含在應用程序的DbContext中)
另外一種是分層關係類型: 一組經過層次關係彼此關係的數據項目. 一個典型的例子是員工與經理,經理也是員工的一種. EF Core使用與一對五和一對多相同的方法來提供層次關係,在第七章詳細討論這類關係與如何配置
圖2.4展現了圖書應用程序的數據庫,在本章和第三章的示例中咱們會使用到它. 圖中包含了咱們以前提到每張表與列的定義
注: PK表示主鍵,FK表示外鍵
爲了幫助理解,圖2.5展現了圖片列表的輸出(只有一書本). 圖書應用程序須要訪問數據庫中的每一張表來構建圖書列表,後面我會使用代碼進行查詢顯示
注: 你能夠在http://efcoreinaction.com/查看在線的示例,會有助於你理解本章的剩餘部分,你也能夠在Github倉庫中找到這個示例在本地調試運行
我建立5個類對應着靈氣庫中的5張表,分別是Book,PriceOffer,Review,Author和BookAuthor(多對多中間表)
這些類稱之爲實休類,以突出它們是由EF Core映射到數據庫的. 從軟件工程的角度來看實體類是普通的.Net類(有時也被稱爲POCO)並無什麼特別之處. 由於它們是EF Core映射到數據庫中的類,因此對其與其餘類區分,稱爲實體類
圖書應用程序中主要的實體類是Book類,以下圖所示. 它引用了PriceOffer類,Review類型的集合以及BookAuthor的集合
咱們使用了EF Core的約定配置實體類的主鍵,也就是類中int類型的Id屬性. 數據庫在添加新行時使用 Sql Identity 命令建立惟一鍵
爲了保持示例的簡單,示例中使用了EF Core的約定配置方法對數據庫建模. .Net類的導航屬性(好比ICollection
本文的示例介紹瞭如何經過EF Core定義和建立數據庫,若是你已經有了一個現有數據庫,可使用EF Core的逆行工程數據庫的功能根據數據庫表構建DbContext類和實體類,在11.3節中會介紹到,若是你不但願EF Core更改數據庫結果而是經過SQL腳本或數據庫部署工具本身來管理,能夠在11.4節中找到方法