系列文章
本節導航
- 三種數據庫關系類型建模
- Migration方式創建和習修改數據庫
- 定義和創建應用DbContext
- 將復雜查詢拆分為子查詢
本章主要介紹如何使用EF Core進行數據庫讀取,俗稱查詢。您將創建一個數據庫,它包含EFCore中三種主要數據庫關系類型。在這個過程當中,你將學會使用EF Core 創建和改變數據庫的結構。
接下來你將學習到如何使用EF Core訪問數據庫並從數據庫表中獲取數據。在查看用主數據加載相關數據的各種方法之前,你將了解EF Core查詢的基本格式。例如,第一章中加載與書關聯的作者。
在學習加載關聯數據之后,你將着手構建更加復雜的查詢,而這些是圖書售賣網站運行起來所必須的。這將涉及到排序,過濾,和分頁,以及將這些單獨的查詢命令組合在一起以創建一個復合數據庫查詢。
2.1 場景設定——我們的圖書銷售網站
本章,你將開始構建一個圖書銷售網站,我們稱之為Book APP。這個應用示例提供了一個非常好的工具來查看查詢中的關系。本節介紹數據庫、各種類以及Book App 訪問數據庫所需的EF Core 部分。
note:你可以在線訪問book app
http://efcoreinaction.com/
2.1.1 Book App 相關的數據庫
盡管我們可以把一本書相關的信息,它的作者,評論都創建在一張表中,但是在關系型數據庫中那樣做不會運行良好,尤其是評論字段的長度是課變的。關系型數據庫范式會將重復數據拆分(比如,authors表)。
我們有幾種方式可以把圖書的數據各個部分在數據庫中分類(存儲),但是對於本例,數據庫具有EF-Core關系中每種主要關系類型中的一種。這三種類型是:
- 一對一關系:PriceOffer to a Book
- 一對多關系:Reviews to a Book
- 多對多關系:Books to Authors
一對一關系:PriceOffer to a Book
一本書會有一個促銷價格。這是通過在PriceOffer*實體類增加一個可選字段實現的,這是一個一對一關心的例子(從技術上講,它是一對零或一關系,但是EF Core對它們的處理時一樣的)。請看圖2.1
為了計算這本你圖書的最終價格,你需要檢查PriceOffer表的一行數據,它們是通過外鍵關聯的。如果這行被查到有數據,NewPrice字段的數據將被查到的價格替代,PromotionalText的值將會在屏幕上顯示,比如:
$40 $30 Our summertime price special, for this week only!
一對多關系:Reviews TO A Book
你允許用戶對圖書予以評論。他們可以給書評星級並能隨意評論。因為一本書可以有零個或多個(不限制數量)評論,你需要創建一個表來存儲上這些數據。本示例中,這張表可以命名為Review。Books表相對於Review表是一對多的關系。如下圖2.2所示:
你需要在摘要顯示中,您需要計算評論的數量並計算出平均星級,以顯示摘要。例如,這里有一個典型的屏幕顯示,你可能從這一對多的關系中產生,如下:
Votes 4.5 by 2 customers
多對多關系: BOOKS TO AUTHORS
圖書可以被一名或者多名寫作,一個作者可以些一本或多本圖書。因此,需要一張Books表來存儲書本數據,另一張表Authors存儲作者數據。Books表和Authors表之間鏈接的表稱為鏈接表。
此關系的典型屏幕顯示如下
by Dino Esposito, Andrea Saltarello
2.1.2 本章未涉及的其他關系類型
在EF Core中,你可以定義一個實體類,而這個是實體類繼承自另一個實體類。例如,你可以定義PriceOffer繼承至BooK.那樣會獲得和此前一對一關系一樣的結果。EFCore通過每個層次結構一個表(TPH)的模式實現,這個在第七章會涉及到。
另外i一種關系類型是分層關系:一組數據項通過層次結構相互關聯。一個典型的實例是Employee類。它有一個指向員工經理的關系,而經理反過來又是員工(注:這種關系可能叫自關聯)。
EF Core使用與一對一和一對多相同的方法來提供層次關系。在第七章,我會更多談論這個關系,在那里,我會解釋如何配置。
2.1.3 最終的數據庫展示所有表
圖2.4 展示了Book App的數據庫,這個數據庫將用於本章和第三章的實例。它包含所有已描述的表,包括完整的books表中所有列的定義
NOTE:
這個數據庫關系圖使用了和第一章相同的布局和術語。PK表示主鍵,FK表示外鍵。
為了幫助你理解這個數據庫,圖2.5展示了輸出到屏幕的圖書列表,但是請將目光聚焦到一本書上。
2.1.4 EF Core映射到數據庫的類
我創建了5個能夠映射到數據庫中五個表的類。它們是Book,PriceOffer,Review , Author,BookAuthor是多對多關系表。
這些類被稱為實體類,以表明它們被EF Core映射到了數據庫。從軟件視角,這些類沒有什么特別之處。它們是常規的.NET類,有時被稱為簡單傳統 CLR 對象(Plain Old CLR Object / POCO)。實體類標志着這個類是EF Core映射到數據庫的類。
主實體類是Book類,如下展示。你可以看到,它關聯了一個實體類PriceOffer,一個Review實體類的集合和BookAuthor實體類的集合。BooKAuthor將Book類鏈接到一個或多個Author.
為了簡單起見,我們使用ef core的契約配置方法對數據庫建模。我們使用EF Core按照慣例來命名實體類的主鍵和外鍵的屬性。此外,.net 的導航屬性,例如ICollection
參考
- 《Entity Framework Core In Action》