如何使用EF6更改dbContext上的连接字符串?

时间:2015-07-21 12:42:30

标签: c# entity-framework wcf

我使用下一个结构构建WCF服务应用程序:

  

WCF客户端 - > WCF服务 - >业务层 - >存储库 - > EF6

我的应用程序要求服务侦听多个客户端,每个客户端都可以请求来自不同数据库的数据(相同的模型)。因此,客户端使用Connect方法告诉它需要使用的数据库服务。 为此,我使用一个创建连接字符串的类。我的问题是如何告诉上下文改变它的连接字符串。到目前为止,我设法通过覆盖构造函数来解决这个问题:

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时,我使用:

context = new OhmioNETEntities(SingleConnection.ConString);

并收到此错误:

  

{"上下文正在Code First模式中使用,该代码是从EDMX文件生成的用于Database First或Model First开发的代码。这将无法正常工作。要解决此问题,请不要删除引发此异常的代码行。如果您希望使用Database First或Model First,请确保Entity Framework连接字符串包含在启动项目的app.config或web.config中。如果要创建自己的DbConnection,请确保它是EntityConnection而不是其他类型的DbConnection,并将其传递给采用DbConnection的基本DbContext构造函数之一。要了解有关Code First,Database First和Model First的更多信息,请参阅此处的实体框架文档:http://go.microsoft.com/fwlink/?LinkId=394715"}

任何想法为什么?谢谢!

6 个答案:

答案 0 :(得分:1)

请注意,您的上下文构建为partial class,这意味着您可以添加自己的构造函数。在同一个项目中,添加以下类:

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

现在,只要您需要上下文,就可以执行此操作:

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

答案 1 :(得分:1)

我们必须在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;
    }

答案 2 :(得分:0)

我所做的是创建一个继续部分类ohmioNETEntities的新文件。在那里,您可以定义一个新的构造函数,该构造函数接受一个字符串参数,该参数调用基本构造函数。

所以 - 这是你的新文件(在重新生成实体时不会被覆盖):

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

这是部分类的优点(以及代码生成模板在这里使用它们的原因)。您可以安全地保留自己的逻辑,同时仍能生成所有内容。

答案 3 :(得分:0)

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


    }

您可以在网络配置中提供连接字符串,如下所示

你的webconfig中的

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

答案 4 :(得分:0)

感谢大家。自己找,我会根据您的所有建议并根据我的需求进行调整:

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

创建上下文:

context = new OhmioNETEntities(SingleConnection.ConString);

答案 5 :(得分:0)

在inicialize类过程中,插入新的连接字符串。

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

如果需要,请尝试在SingleConnection.ConString中插入文本变量@password,并替换为base.Database.Connection.ConnectionString。它工作正常!