2015-07-21 82 views
1

我建立下一個結構的WCF服務應用程序:如何使用EF6更改dbContext上的連接字符串?

WCF Client -> WCF Service -> Business Layer -> Repository -> EF6

我的應用程序需要該服務收聽到多個客戶端,每個至極的可以要求來自不同數據庫(同一型號)的數據。因此,客戶端使用Connect Method來告訴服務器需要使用哪個數據庫。 爲此,我使用創建連接字符串的類。我的問題是如何告訴上下文來改變它的連接字符串。到目前爲止,我管理的覆蓋這樣的構造函數來解決此問題:

public partial class OhmioNETEntities : DbContext 
{ 
    public OhmioNETEntities() : base(SingleConnection.ConString) 
    { 
    } 
} 

這工作,但問題是,如果我刷新模式,這個碼是

public partial class OhmioNETEntities : DbContext 
{ 
    public OhmioNETEntities() : base("name=OhmioNETEntities") 
    { 
    } 
} 

丟失和更換有這樣做的最好方法? 謝謝!

編輯 感謝所有的幫助,但我不能得到它的工作。 作爲建議我添加新的文件與此代碼:

public partial class OhmioNETEntities : DbContext 
{ 
    public OhmioNETEntities(string ConString) 
    { 
    } 
} 

,當我創建上下文我使用:

context = new OhmioNETEntities(SingleConnection.ConString); 

,並得到這個錯誤:

{"The context is being used in Code First mode with code that was generated from an EDMX file for either Database First or Model First development. This will not work correctly. To fix this problem do not remove the line of code that throws this exception. If you wish to use Database First or Model First, then make sure that the Entity Framework connection string is included in the app.config or web.config of the start-up project. If you are creating your own DbConnection, then make sure that it is an EntityConnection and not some other type of DbConnection, and that you pass it to one of the base DbContext constructors that take a DbConnection. To learn more about Code First, Database First, and Model First see the Entity Framework documentation here: http://go.microsoft.com/fwlink/?LinkId=394715 "}

任何想法,爲什麼?謝謝!

+0

您可以編輯model.tt模板文件進行更改生成的代碼,每次持續。 –

回答

0

我所做的是創建一個新文件,繼續部分類ohmioNETEntities。在那裏,你可以定義一個新的構造函數,它接受一個字符串參數,它調用基礎構造函數。

所以 - 這是你的新文件(重新生成實體時不會被覆蓋):

public partial class OhmioNETEntities { 
    public OhmioNETEntities(string connectionstring) : base(connectionstring) { 
    } 
} 

這部分類(和代碼生成模板使用他們在這裏的原因)的美景。您可以安全地保留自己的邏輯,同時仍能夠生成所有內容。

+0

請參閱我的更新 – ericpap

1

請注意,您的上下文構建爲partial class,這意味着您可以添加自己的構造函數。在同一個項目中,添加這個類:

public partial class OhmioNETEntities 
{ 
    public OhmioNETEntities(string connectionString) : base(connectionString) 
    { 
    } 
} 

現在,無論你需要你的背景,你可以這樣做:

var myContext = new OhmioNETEntities("connection string here"); 
+0

請參閱我的更新 – ericpap

0
public class SMISContext : DbContext 
{ 
    public SMISContext() 
     : base("SMISContext") 
    { 
     Database.SetInitializer<SMISContext>(null); 


    } 

可以提供web配置你的連接字符串如下

在webconfig:

<connectionStrings> 
<add name="SMISContext" connectionString="Data source=FARKA-DC\ISIMS;initial catalog=SMISJULY_08; user id=sa; [email protected];multipleactiveresultsets=True;App=EntityFramework" providerName="System.Data.SqlClient"/> 

+0

請參閱我的更新 – ericpap

0

謝謝大家。找到它自己,我關注你的所有意見,並使其適應我的需求:

public partial class OhmioNETEntities : DbContext 
{ 
    public OhmioNETEntities(string ConString) : base(ConString) 
    { 
    } 
} 

並創建上下文:

context = new OhmioNETEntities(SingleConnection.ConString); 
0

在inicialize類程序,插入新的連接字符串。

public OhmioNETEntities() : base(SingleConnection.ConString) 
{ 
    base.Database.Connection.ConnectionString = "new connection string here";  
} 

如果你需要嘗試SingleConnection.ConString插入文本變量@Password和base.Database.Connection.ConnectionString更換。它工作正常!

0

我們必須提供實體連接字符串中的DbContext

SqlConnectionStringBuilder sqlString = new SqlConnectionStringBuilder() 
     { 
    DataSource = "SOURAV-PC", // Server name 
    InitialCatalog = "efDB", //Database 
      UserID = "sourav",   //Username 
      Password = "mypassword", //Password 
     }; 
     //Build an Entity Framework connection string 

     EntityConnectionStringBuilder entityString = new EntityConnectionStringBuilder() 
     { 
      Provider = "System.Data.SqlClient", 
      Metadata = "res://*/testModel.csdl|res://*/testModel.ssdl|res://*/testModel.msl", 
      ProviderConnectionString = sqlString.ToString() 
     }; 
     return entityString.ConnectionString; 
    } 
相關問題