期待已久的EF終於來了。 html
學完本篇文章,你將會掌握基於EF數據模型的完整開發流程。 前端
本次將會完成EF數據模型的搭建和使用。 web
基於這個模型,將以前的示例添加數據庫查詢驗證功能。 數據庫
概述 & 要點 架構
詳細步驟 app
總結 框架
下面是本文要點,正文部分會有詳細介紹。 ide
Models文件夾裏面存放對應於數據庫表的實體。 函數
View中須要顯示的數據和Models中實體模型不必定能對應上, 所以須要專門給View使用的自定義數據模型,咱們稱之爲ViewModel , 放在ViewModels文件夾裏面。 工具
DAL 放置數據訪問相關類。
NOTE 本文中放AccountContext.cs, AccountInitializer.cs
爲了更加貼近真實狀況,咱們針對用戶創建三個相關的類。
SysUser, SysRole, SysUserRole
這是用戶權限管理RBAC (Role – Based Access Control)的一個典型模型, 更復雜的模型均可以在這個基礎上進行擴展。
OK,下面咱們就開始新建這個模型。
咱們先去網上找個大體的關係圖作參考,打開百度,輸入 user role , 搜索圖片。
挑一個相似的作參考。
NOTE 權限相關是系統管理範疇的,不涉及具體業務,我起名字的時候都加了Sys前綴,這樣和業務區隔開來。
參考上面這個圖創建 Data Model
SysUser Entity
SysRole Entity
SysUserRole Entity
對於上面幾個類的約定和說明:
例如外鍵 SysUserID = SysUser(navigation property)+ID(SysUser的主鍵)
navigation 屬性保存着其餘的關聯entity(entities)
示例中, SysUser和SysUserRole是一對多的關係, SysRole和SysUserRole也是一對多的關係.
若是是 "多", 屬性類型就必須是list( 這裏用的是Icollection )
前置條件:安裝EF
打開 工具à庫程序包管理器à程序包管理器控制檯
輸入 install-package entityframework
去MSDN上查看下EF的架構圖:http://msdn.microsoft.com/en-us/data/aa937709
從上圖能夠看出,EF框架在底層是經過調用ADO.NET來實現數據庫操做的。
多轉一道彎性能和靈活性確定會受到影響,因此本系列文章結束後一樣也會給出MVC+ADO.NET的方案,你們能夠根據須要選擇。
NOTE
微軟官方推出的ORM框架主要有Linq to SQL和Entity Framework.
EF是目前最新的,也是推薦配合MVC使用的框架。
實際操做前再補充一些重要概念:
若是不用ORM框架,咱們通常這樣來使用ADO.NET進行數據庫開發:
使用ORM以後,之前面的SysUser爲例:
O(Object) à 程序中的類 SysUser, 就是對象
R (Relation)à 數據庫中的表
M(Mapping)à O和R的映射關係
ORM對傳統方式的改進:
充當橋樑,實現了關係數據和對象數據的映射,經過映射自動產生SQL語句。
對經常使用的操做,節省了寫SQL語句的步驟。
好了,如今必要的概念應該理解了吧,下面咱們就進行實際的操做了。
建立類 AccountContext.cs , 讓他繼承自System.Data.Entity.DbContext, 咱們用這個類完成EF的功能。
主要作下面三件事:
在EF中,一般狀況下一個entity set對應數據庫中的一張表,一個entity對應表中的一行。
構造函數中的 base("AccountContext") 。
默認狀況下和類名同樣,即AccountContext,咱們顯式的給他指定出來。
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
默認狀況下會生成複數形式的表,如SysUsers
NOTE 表名用單複數形式看各自的習慣,沒有明確的規定。有的公司表名全用單數,有的公司根據表的意思,有單數也有複數。
配合上面第2點,先把web.config中鏈接字符串給指定了。
以下圖,貼着appSettings配置節上面添加。注意要web.config中要加上紅字部分,不然會出錯。
<
connectionStrings
>
<
add
name="AccountContext" connectionString="Data Source=.;database=MvcDemo;uid=sa;pwd=123456;AttachDBFilename=|DataDirectory|\MvcDemo.mdf;" providerName="System.Data.SqlClient"/>
</
connectionStrings
>
NOTE AttachDBFilename=|DataDirectory|\MVCDemo.mdf設定了數據庫文件的存放位置:在項目根目錄的App_Data文件夾下。
EF能夠以多種方式創建數據庫。
咱們採用以下方式:
第一次運行程序時新建數據庫,插入測試數據; model改變(和database不一致)時刪除重建數據庫,插入測試數據。
目前在開發階段,不用管數據丟失的問題,直接drop and re-create比較方便。
等系列文章結束後會講解生產環境中如何不丟失數據修改schema
下面咱們就新建類AccountInitializer.cs來完成這個工做。
Seed方法用咱們以前定義的database context(即AccountContext) 做爲參數,經過這個context將entities添加到database中去。(就是咱們前面說的橋樑做用)
從上面代碼能夠看出, Seed方法對每個entity的類型(咱們用了SysUser和SysRole, SysUserRole咱們暫不添加):
建立一個colletion à 添加到適當的 DbSet property à 保存到數據庫。
NOTE 不必定要在每一個entity組後面都調用SaveChanges方法,能夠在全部組結束後調用一次也能夠。這樣作是由於若是寫入數據庫代碼出錯,比較容易定位代碼的錯誤位置。
修改web.config, 通知EF使用咱們剛剛寫好的initializer類。
找到entityFramework配置節,添加下圖方框處內容。
context 配置節中, type 的值對應 (context class的完整描述,程序集)
databaseInitializer 配置節中 , type 的值對應 (initializer class 的完整描述,程序集)
NOTE : 若是你不想EF使用某個context, 能夠將下面方框處設置爲true.
如今EF一切就緒.
運行程序,當第一次鏈接數據庫時,EF比較model(AccountContext和entity classes) 和database. 若是兩邊不一致,程序將會drop and re-create數據庫。
由於目前咱們尚未鏈接數據庫的操做,因此EF還沒發揮做用。
如今咱們完成前面的Login功能。
一樣DALàAccountInitializer.csàSeed裏面示例數據也要增長這個字段
NOTE 添加一個Email是由於以前的登陸頁面填入的是Email值,後面將會輸入Email和Password到數據庫中進行比對。
NOTE
用過SQL的人都知道,學習SQL,最複雜的是查詢,把各類查詢學好了,基本就掌握70%以上了。
EF數據模型的數據操做也同樣,重點是查詢,下篇文章會展開講。(從簡單查詢到條件、聚合、鏈接等複雜查詢都會涉及到)
運行Login.cshtml頁面,輸入正確的和錯誤的登陸信息驗證下。
另外再檢查一下數據庫部分是否符合咱們的預期:
OK,到此爲止,咱們搭建好了EF框架,進行了數據庫的初始化,查詢了一條用戶信息。
須要說明的是,如今的登陸功能還比較簡陋,不是真正的登陸功能(例如輸入項還缺乏驗證,密碼尚未加鹽),只是爲了說明EF的用法。根據系列文章講述知識點的須要,最終會實現完整功能。
最後再回顧下本篇文章的重點:掌握使用EF開發的整個過程。
建立Data Modelà建立Database Context à建立databaseInitializerà配置entityFramework的context配置節
但願你們能清晰的瞭解上面整個過程,理解每個過程的做用。
好了,本次文章就到這裏。
歡迎你們多提問題多評論,讓下一篇文章更好 :)
爲方便你們觀看,列出系列文章地址: