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

本文关键字:连接 字符串 dbContext 何使用 EF6 更改 | 更新日期: 2023-09-27 18:03:42

我正在构建一个具有下一个结构的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 = new OhmioNETEntities(SingleConnection.ConString);

并得到这个错误:

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

知道为什么吗?谢谢

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

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

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

现在,无论你在哪里需要你的上下文,你都可以这样做:

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

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

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

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

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

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

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; password=1qazXSW@;multipleactiveresultsets=True;App=EntityFramework" providerName="System.Data.SqlClient"/>

感谢大家。我自己找到它,我听从你的所有建议,并根据我的需求进行调整:

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

创建上下文:

context = new OhmioNETEntities(SingleConnection.ConString);

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

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

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