【问题标题】:How can I change Connection String on dbContext with EF6?如何使用 EF6 更改 dbContext 上的连接字符串?
【发布时间】:2015-07-21 12:42:29
【问题描述】:

我正在构建具有下一个结构的 WCF 服务应用程序:

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

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

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);

并得到这个错误:

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

知道为什么吗?谢谢!

【问题讨论】:

  • 您可以编辑model.tt模板文件,使您的更改在每次生成代码时都保持不变。

标签: c# entity-framework wcf


【解决方案1】:

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

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

现在,无论您需要什么上下文,都可以这样做:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        【解决方案4】:
        public class SMISContext : DbContext
        {
            public SMISContext()
                : base("SMISContext")
            {
                Database.SetInitializer<SMISContext>(null);
        
        
            }
        

        您可以在 web config 中提供您的连接字符串,如下所示

        在您的网络配置中:

        <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"/>
        

        【讨论】:

          【解决方案5】:

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

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

          并创建上下文:

          context = new OhmioNETEntities(SingleConnection.ConString);
          

          【讨论】:

            【解决方案6】:

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

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

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

            【讨论】:

              猜你喜欢
              • 2014-02-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-08-02
              • 1970-01-01
              相关资源
              最近更新 更多