[翻譯 EF Core in Action 2.1] 設置一個圖書銷售網站的場景

Entity Framework Core in Action

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網站

  • PriceOffers表有一個鏈接到books表主鍵的外鍵

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

  • EF Core使用它的約定來檢測這是一個一對一的關係,所以它爲外鍵添加了惟一索引,確保每本書只能有一個優惠價格

計算圖書的最終價格,須要經過外鍵找到與圖書連接的優惠價格記錄. 若是找到了記錄,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

  • Review表經過BookId外鍵連接到Books表

在顯示圖書介紹時,須要計算評論數量與平均星級評價. 這些經過一對多的關係去檢索. 呈如今頁面上是如下效果:

  • 平均分 4.5 共有1000用戶評論

多對多的關係: 圖書與做者

一書本可能由一我的編寫也可能由多人編寫, 一我的(做者)能夠著做一本書或多本書. 這是一個典型的多對多關係,在數據庫中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

  • BookAuthor表是多對多關係的核心,稱爲中間表

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

  • BookAuthor表使用外鍵作爲主鍵,由於主鍵必須是惟一的, 因此確保了書和做者之間只能有一個連接

多對多關係的頁面展現以下

  • 刪庫到跑路 - 個人程序一輩子 趙日天,蕭炎,林動 著

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倉庫中找到這個示例在本地調試運行

EF Core映射數據庫的類

我建立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 )定義了我須要關係類型,例如Reviews屬性的類型是ICollection,因此是一對多關係. 第六章和第七章介紹了建模的其餘方法

本文的示例介紹瞭如何經過EF Core定義和建立數據庫,若是你已經有了一個現有數據庫,可使用EF Core的逆行工程數據庫的功能根據數據庫表構建DbContext類和實體類,在11.3節中會介紹到,若是你不但願EF Core更改數據庫結果而是經過SQL腳本或數據庫部署工具本身來管理,能夠在11.4節中找到方法

相關文章
相關標籤/搜索