ASP.NET沒有魔法——ASP.NET MVC 與資料庫之EntityFramework配置與連接字串

來源:互聯網
上載者:User

標籤:類型   aop   類構造   預設   改變   內建   context   應用   connect   

  前幾篇文章中介紹了如何使用Entity Framework來操作資料庫,但是對EF的配置、連接字串的指定仍然存在一些疑問。
  本章將對EF的配置進行介紹。
  EF可以通過兩種方式來實現配置,分別是代碼方式和設定檔。

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遵循約定優先配置原則,所有的配置都有預設的行為,一般如果沒有特殊需求不需要修改配置。

參考:

  https://msdn.microsoft.com/en-us/library/jj556606(v=vs.113).aspx
  https://msdn.microsoft.com/en-us/library/jj680699(v=vs.113).aspx
  https://msdn.microsoft.com/en-us/library/jj592674(v=vs.113).aspx

本文串連:http://www.cnblogs.com/selimsong/p/7655949.html 

 ASP.NET沒有魔法——目錄

ASP.NET沒有魔法——ASP.NET MVC 與資料庫之EntityFramework配置與連接字串

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.