前幾篇文章中介紹了如何使用Entity Framework來操作數據庫,但是對EF的配置、連接字符串的指定仍然存在一些疑問,EF可以通過兩種方式來實現配置,分別是代碼方式和配置文件。
本章將通過以下幾點對EF的配置進行介紹:
●Entity Framework的配置文件
●EntityFramework節點解析
●關於ConnectionString
●使用代碼方式修改配置
●根據實際需求選擇適合的配置方式
Entity Framework的配置文件
對於配置文件來說,在安裝Entity Framework的時候將會自動在配置文件中插入以下內容:
首先是ConfigSection:
ConfigSection是.Net程序用來自定義配置節點的節點,所以這個節點的作用是告訴.Net程序有一個自定義的配置節點,自定義節點的名稱和類型是什么。
名稱很好理解就是接下來的entityFramework節點,但是類型指的是什么呢?
類型指的是用於處理名稱所指配置信息的處理器,下面代碼是上面配置的節點類型定義:
里面的內容與配置文件是有關聯的,如何自定義配置節點可參考:https://msdn.microsoft.com/en-us/library/2tw134k3.aspx
EntityFramework節點解析
EntityFramework節點下主要有providers、interceptors、contexts、defaultConnectionFactory,基本上與EntityFrameworkSection類型是對應的。
1. providers:
根據類型EntityFrameworkSection定義來看,providers是一個provider的集合,而每一個provider的配置分別需要provider的名稱(不變的用於做標識)、類型(提供器所在的命名空間和程序集)。以下是默認的SqlServer提供器:
2. interceptors:
攔截器,也是一個列表,每一個interceptors提供類型(命名空間和程序集名稱)以及相應的參數來完成配置,以下是EF自帶的日志攔截器。
以下是加入日志攔截器的運行效果:
注:所謂攔截器是一種面向切面(AOP)的編程方式,是一種不修改源代碼的前提下對應用程序進行拓展的編程方式。一般AOP用來處理日志記錄、性能統計、安全控制、事務處理、異常處理等不會對原有業務數據進行修改的功能。
3. contexts:
contexts節點下可以存在多個context節點,該節點用於數據庫初始化,默認情況下DbContext在初始化的時候如果沒有數據庫會自動創建。如果不需要可以在配置文件中加入如下配置禁用:
可以使用databaseInitializer元素來設置數據庫自定義初始化(以下是官方文檔例子):
或者數據庫的自動遷移(官方文檔例子):
4. defaultConnectionFactory
defaultConnectionFactory會指定一個默認的連接工廠,這個連接工廠當使用代碼優先的時候去查找一個數據庫給DbContext使用(注:當DbContext不存在數據庫連接字符串的時候才會生效)。
當通過Nuget來安裝EF包的時候會根據本機情況來注冊一個默認的ConnectionFactory,SQL Express或者LocalDb(注:所以說一個新建的MVC帶身份驗證的模板項目有數據存儲機制,這個機制就可能是有SQL Express或者LocalDb來實現的)。以下配置就是基於LocalDb的,主要有Factory類型和參數
如果沒有設置defaultConnectionFactory那么默認將使用SqlConnectionFactory(注:所以在沒有配置的情況下則使用SQL Server數據庫)。
SqlConnectionFactory也可以在defaultConnectionFactory中配置,它可以通過參數來指定一個連接字符串,這樣就不需要連接字符串了:
關於ConnectionString
關於ConnectionString上面介紹了defaultConnectionFactory是不存在數據庫連接字符串的時候才生效,那么數據庫連接字符串要如何處理呢?DbContext又如何來判斷連接字符串是否存在?以下就是連接字符串選擇的邏輯:
1. 當沒有配置任何連接字符串(包括默認連接工廠和ConnectionString節點),DbContext使用無參構造方法時,DbContext將默認使用DbContext所在命名空間和DbContext類型名稱來作為數據庫名稱(如本例中將會是:BlogRepository.BlogDbContext),然后創建一個連接到SQL Express或LocalDb數據庫連接前者優先使用。
注:SQL Express和LocalDb都可以看作是SQL Server數據庫的開發者使用版本。
2. 在DbContext的構造方法中指定數據庫名稱(注意必須在基類型的構造中指定),那么將使用指定的名稱,然后創建一個連接到SQL Express或LocalDb數據庫連接前者優先使用。
3. 在DbContext的構造方法中指定數據庫連接字符串(注意必須在基類型的構造中指定),那么將使用該字符串,並且默認使用System.Data.SqlClient作為提供器,即通過這種方式指定連接字符串默認使用SQL Server,如果要使用其它數據庫需要更改context.Database.DefaultConnectionFactory的設置。
4. 在web.config/app.config文件中配置了連接字符串后,如果DbContext的類型名稱與連接字符的name屬性相同(無論是否包含全命名空間)或者在基類構造方法中指定了連接字符串的名稱,那么都將使用這個配置信息來作為連接字符串。
詳情參考:https://msdn.microsoft.com/en-us/library/jj592674(v=vs.113).aspx
使用代碼方式修改配置
以上主要是對EF中的提供器provider、攔截器interceptor、默認連接工廠defaultConnectionFactory以及數據庫初始化Context的配置進行了介紹,對於這些內容都可以通過代碼的方式來完成配置,但要注意的是代碼的配置會被配置文件的配置覆蓋,如果相同配置存在代碼和配置文件中,那么配置文件的生效。
1. 定義一個類型繼承至System.Data.Entity.DbConfiguration。
2. 為該類型創建一個無參公共構造方法。
3. 在構造方法中調用一系列保護方法完成配置。
4. 在DbContext類型上使用DbConfigurationType特性:
注:此處的連接字符串數據庫名稱需要通過DbContext基類傳入,否則使用{命名空間.DbContext}名稱作為數據庫名。
5. 刪除所有與EF相關的配置然后運行程序:
根據實際需求選擇適合的配置方式
在本例中因為存在多個數據庫解決方案,所以會存在多套配置,而且它們都共用同一個MVC程序,所以每次切換數據庫時如果把配置文件放在web.config中都需要修改相應的EF配置,所以應該盡量把不易變的配置寫在程序中。
對於攔截器應該寫在配置文件中,因為它可能會隨意的被添加和刪除。
其次數據庫連接字符串是會經常改變的,比如環境變化、數據庫賬號密碼變更等,所以也應該放在配置文件中。
根據以上分析對My Blog程序修改如下:
1. 在配置類型中定義provider:
2. 在web.config文件中加入EF配置,但僅配置攔截器:
3. 添加數據庫連接字符串:
4. 在DbContext類型上使用DbConfigurationType特性:
5. 運行結果:
小結
本章主要是介紹了EF的配置,分別用配置文件和代碼的方式實現了EF配置,當使用代碼配置時,MVC項目不再需要加入任何EF配置即可運行應用程序。了解配置文件有利於了解EF的運行機制,也便於將數據庫變更至MySQL。
在微軟文檔中有這樣一句話:
Entity Framework allows a number of settings to be specified from the configuration file. In general EF follows a ‘convention over configuration’ principle. All the settings discussed in this post have a default behavior, you only need to worry about changing the setting when the default no longer satisfies your requirements.
意思是說EF遵循約定優先配置原則,所有的配置都有默認的行為,一般如果沒有特殊需求不需要修改配置。
歡迎添加個人微信號:Like若所思。
歡迎關注我的公眾號,不僅為你推薦最新的博文,還有更多驚喜和資源在等着你!一起學習共同進步!