2015-07-21 50 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; 
    } 
相关问题