ASP.NET開發實戰——(十一)ASP.NET MVC 與數據庫之EntityFramework配置與連接字符串

 前幾篇文章中介紹瞭如何使用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若所思。

歡迎關注我的公衆號,不僅爲你推薦最新的博文,還有更多驚喜和資源在等着你!一起學習共同進步!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章