[翻译 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: 翻譯難免限于本人水平有不準確的地方,建議英文水平不錯的同學直接查看原版,有不足的地方歡迎指正
第一部分目錄導航
假設場景 -- 圖書銷售網站
在本章中你會構建一個圖書銷售網站示例,稱之為圖書應用程序. 這個示例應用程序幫助我們查看查詢中的關系. 本節中介紹了圖書應用程序所需的數據庫與EF Core的實體類部分
- 這里是圖書應用程序的運行實例 http://efcoreinaction.com
圖書應用程序的關系型數據庫
雖然我們可以將作者,書,評論等所有數據都放到一張表中,但在關系型數據庫中這樣設計是很糟糕的,關系型數據庫的規范是分離重復的數據,例如作者
我們有多種方式在數據庫設計圖書數據的各種部分,在本例中的數據庫具有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 book
- EF Core使用它的約定來檢測這是一個一對一的關系,因此它為外鍵添加了唯一索引,確保每本書只能有一個優惠價格
計算圖書的最終價格,需要通過外鍵找到與圖書鏈接的優惠價格記錄. 如果找到了記錄,NewPrice會取代原書的價格,并將PromotionalText顯示到屏幕上; 例如:
原價¥40現價¥9.9 溫州印書場倒閉了,老板帶著小姨子跑路了. 原價都是四十五十的,現價只要九塊九
一對多的關系: 書的評論
顧客可以評價一本書;他們可以評星級,也可以留文字評論. 因為一本書可能沒有一個評論或者有很多(無限)的評論,所以需要創建一張表保存這些數據. 在本例中它是Review表. Books表與Review表是一對多的關系, 如圖2.2所示
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節中找到方法
轉載于:https://www.cnblogs.com/LiangSW/p/10761977.html
總結
以上是生活随笔為你收集整理的[翻译 EF Core in Action 2.1] 设置一个图书销售网站的场景的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 抢攻5G网络功能虚拟化,英特尔推专用FP
- 下一篇: 湖北高校实用的大数据平台,专业的高校大数
