2012-08-24 206 views
3

所以我想這很簡單,但出於某種原因,我無法找到答案。我的問題是我以前使用從ObjectContext繼承的EF 4.3.1上下文,並且自動生成總是創建一個重載的構造函數,該構造函數接受連接字符串作爲參數。提供連接字符串到EF 5.0型號

現在我試圖切換到EF 5.0,我不得不使用DbContext版本。但是從DbContext繼承的MyEntities只有無參數的構造函數可用。我想我可以自己添加重載的構造函數,並調用base(connectionString),但對自動生成的文件進行手動更改看起來像是一個冒險的業務。

那麼如何創建MyEntities的實例,該實例使用我在運行時提供的連接字符串?

+0

這不是真正的「自動生成」,即使你使用的EF電動工具進行反向工程的模式上課,至少在一個'EDMX'的意義,當任何改變設計師重新創建你的所有類。現在它生成一次。理論上,映射和上下文代碼可以全部手寫,所以IMO可以自由添加第二個構造函數。這不僅僅是一個答案,也許別人有更好的主意。 :) –

+0

至少該文件在MyEntities.Context.tt下顯示爲MyEntities.Context.cs,甚至有警告說該文件是在文件開頭自動生成的,並且手動更改將被覆蓋。 – bobblez

+0

啊,所以你使用T4代。那麼也許,是的,我真的不能說任何明確的因爲我從來沒有使用T4模板。如果你使用純粹的'代碼'版本的映射(無論是Code-First還是Database-First,都沒關係),那麼我認爲沒有理由不去修改它。 –

回答

1

您是否嘗試過使用connectionFactory?

本示例適用於SqLite,但適用於所有數據庫。

也可以做類似下面這樣的類:

public class SqLiteConnectionFactory : IDbConnectionFactory 
{ 
    public System.Data.Common.DbConnection CreateConnection(string nameOrConnectionString) 
    { 
     var databaseDirectory = @"C:\\master.db"; 

     var builder = new SQLiteConnectionStringBuilder 
     { 
      DataSource = databaseDirectory, 
      Version = 3 
     }; 
     return new SQLiteConnection(builder.ToString()); 
     } 
} 

,然後通過執行以下語句,您訪問的背景下,第一次使用前,如果:

Database.DefaultConnectionFactory = new ConnectionFactories.SqLiteConnectionFactory(); 
0

這裏是一個函數建立你的連接字符串(火鳥在這裏):

private static string ConnectionString(string dbFileName) 
    { 
     // Specify the provider name, server and database. 
     const string providerName = "FirebirdSql.Data.FirebirdClient"; 
     const string metaData = "res://*/RcModel.csdl|res://*/RcModel.ssdl|res://*/RcModel.msl"; 

     // Initialize the EntityConnectionStringBuilder. 
     EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder(); 

     //Set the provider name. 
     entityBuilder.Provider = providerName; 

     FbConnectionStringBuilder sqlBuilder = new FbConnectionStringBuilder(); 

     sqlBuilder.UserID = "sysdba"; 
     sqlBuilder.Password = "masterkey"; 
     sqlBuilder.DataSource = @"127.0.0.1"; 
     sqlBuilder.Database = dbFileName; 
     sqlBuilder.Dialect = 3; 
     sqlBuilder.Charset = "UTF8"; 
     sqlBuilder.ServerType = FbServerType.Default; 

     // Set the provider-specific connection string. 
     entityBuilder.ProviderConnectionString = sqlBuilder.ConnectionString; 
     entityBuilder.Metadata = metaData; 
     return entityBuilder.ToString(); 
    } 

使用它:

 string cs = ConnectionString(@"C:\myDbFile.fbd"); 
     EntityConnection conn = new EntityConnection(cs); 
     MyEntities db = new MyEntities(conn); 
-1

您可以在創建MyEntities的位置執行此操作。事情是這樣的:

MyEntities dataContext = new MyEntities(); 

dataContext.Database.Connection.ConnectionString = "<YOUR CONNECTION STRING>"; 

如果你的EDMX是設置來尋找你的配置還是會這麼做時創建的,但你可以去掉嵌入式裏面的數據庫提供連接字符串連接字符串。這樣做,它會是這個樣子(如果連接到SQL)後:

<connectionStrings> 
     <add name="MyEntities" connectionString="metadata=res://*/MyEntities.csdl|res://*/MyEntities.ssdl|res://*/MyEntities.msl;provider=System.Data.SqlClient;provider connection string=;" providerName="System.Data.EntityClient" /> 
</connectionStrings>