EF 數據庫鏈接約定(Connection String Conventions in Code First)

一個典型的EF應用大多數狀況下是一個DbContext的派生類(derived class)來控制,一般可使用該派生類調用DbContext的構造函數,來控制如下的東西:web

(1)、上下文如何鏈接到數據庫(給定鏈接字符串)sql

(2)、上下文是經過Code First語法計算模型仍是使用EF 設計器數據庫

(3)、額外的高級選項服務器

下面是DbContext構造器的經常使用的用途:app

1、DbContext無參構造函數less

若是當前EF應用中沒有作任何的配置.且在你自定義的數據庫上下文類中沒有調用DbContext帶參的構造函數,那麼當前應用對應的數據庫上下文類,將會調用DbContext的默認無參的構造函數(EF默認規定的數據庫鏈接),代碼以下:ide

namespace Demo.EF 
{ 
    public class EFStudyContext : DbContext 
    { 
        public EFStudyContext()// C# will call base class parameterless constructor by default 
        { 
        } 
    } 
}

 

EF默認的聯結字符串以下:函數

Data Source=(localdb)\mssqllocaldb;Initial Catalog=EFStudyConsole(項目名稱).EFStudyDbContext(上下文名稱);Integrated Security=True;MultipleActiveResultSets=True

 

EF會用上下文的徹底限定名(命名空間+上下文類)做爲數據庫名,建立一個鏈接字符串,該鏈接字符串會鏈接本地的SQL Express或者LocalDb,並在SQL Express或者LocalD建立對應的數據庫,若是二者都安裝了,則會選擇鏈接SQL Express。ui

注:VS2010默認安裝SQL Express,VS2012默認安裝LocalDb,在安裝過程當中,EF NuGet包會檢查哪一個數據庫服務(前面介紹的)可用,當EF建立默認鏈接的時候,當EF建立默認連接的時候,NuGet包將經過設置默認的Code First數據庫服務器來更新配置文件,該數據庫服務器在經過約定建立鏈接時首先使用該服務器。.若是SQL Express 正在運行,它會被使用,若是它不可用,LocalDb會替代它,可是這個過程不會對配置文件作任何的更改,若是它已經包含默認鏈接工廠的設置.spa

 

2、DbContext帶string參數的構造函數

一、若是沒有在數據庫上下文進行其餘額外的配置,而後調用DbContext中的帶參的構造函數,傳入你想要使用的數據庫鏈接字符串,而後Code First中的數據庫上下文就會運行在基於當前數據庫鏈接字符串上.代碼以下:

public class BloggingContext : DbContext 
{ 
    public BloggingContext(): base("BloggingDatabase") 
    {} 
}
Data Source=(localdb)\mssqllocaldb;Initial Catalog=BloggingDatabase;Integrated Security=True;MultipleActiveResultSets=True

 

二、使用app.config/web.config配置文件中的鏈接字符串,表示你在應用程序中已經進行了配置,這一點要區分上面的方法.

(1)、有Ado.Net使用經歷的都知道,通常狀況下,數據庫鏈接字符串通常定義在app.config/web.config配置文件中,例如:

<configuration> 
  <connectionStrings> 
    <add name="BolggingContext" 
         providerName="System.Data.SqlServerCe.4.0" 
         connectionString="Data Source=Blogging.sdf"/> 
  </connectionStrings> 
</configuration>

這在EF中至關於告訴數據庫上下文去使用當前鏈接字符串對應的數據庫服務,而不是使用SQL Express or LocalDb,數據庫上下文代碼以下:

public class BloggingContext : DbContext 
{ 
    public BloggingContext()
    { 
    } 
}

若是鏈接字符串的name屬性值和上下文類名同樣(either with or without namespace qualification),那麼數據庫上下文在執行無參構造函數的時候,會使用配置文件的鏈接字符串去鏈接數據庫.

using (var context=new BloggingContext())
{
     string connStr = context.Database.Connection.ConnectionString;
     Console.WriteLine(connStr);
}   

 

(2)、若是鏈接字符串的name屬性值和上下文類名不同,可是仍是但願上下文使用配置文件的數據庫鏈接進行數據庫鏈接,這時就須要在上下文構造函數中調用DbContext的帶string參數的構造函數,並傳入鏈接字符串的name屬性值,代碼以下:

    public class BloggingContext:DbContext
    {
        public DbSet<User> Users { get; set; }

        public BloggingContext():base("BloggingStr")
        {

        }
    }
    static void Main(string[] args)
    {
         using (var context=new BloggingContext())
         {
             string connStr = context.Database.Connection.ConnectionString;
             Console.WriteLine(connStr);
         }
         Console.ReadKey();
    }

另一種方式是傳遞給DbContext構造函數配置文件中的connectionString節點的name屬性來指定上下文經過配置文件中connectionString來鏈接字符串,代碼以下:

    public class BloggingContext:DbContext
    {
        public DbSet<User> Users { get; set; }

        public BloggingContext():base("name=BloggingStr")
        {

        }
    }
    static void Main(string[] args)
    {
        using (var context=new BloggingContext())
        {
            string connStr = context.Database.Connection.ConnectionString;
            Console.WriteLine(connStr);
        }
        Console.ReadKey();
    }

上面這種方式是明確EF進行數據庫鏈接的時候去配置文件找鏈接字符串。

(3)、鏈接字符串的終極解決方案,直接給鏈接字符串,什麼都不要配,代碼以下:

    public class BloggingContext:DbContext
    {
        public DbSet<User> Users { get; set; }

        public BloggingContext():base("server=.;database=EFStudy;uid=sa;pwd=123456;")
        {

        }
    }
    static void Main(string[] args)
    {
         using (var context=new BloggingContext())
         {
             string connStr = context.Database.Connection.ConnectionString;
              Console.WriteLine(connStr);
          }
          Console.ReadKey();
     }

注:默認狀況下,當前的鏈接字符串使用的是System.Data.SqlClilent做爲provider,這裏能夠被改變經過作一個IConnectionFactory的不一樣的實現來替換context.Database.DefaultConnectionFactory默認的實現.

 

3、還有其餘兩種方法,不經常使用

一、You can use an existing DbConnection object by passing it to a DbContext constructor. If the connection object is an instance of EntityConnection, then the model specified in the connection will be used rather than calculating a model using Code First. If the object is an instance of some other type—for example, SqlConnection—then the context will use it for Code First mode.

使用一個DbConnection 實例,或者是SqlConnection實例或者EntityConnection實例,傳遞給DbContext的構造函數都可指定對應的數據庫鏈接規則.

 

二、You can pass an existing ObjectContext to a DbContext constructor to create a DbContext wrapping the existing context. This can be used for existing applications that use ObjectContext but which want to take advantage of DbContext in some parts of the application.

相關文章
相關標籤/搜索