【问题标题】:Switch between databases with one DbContext使用一个 DbContext 在数据库之间切换
【发布时间】:2015-09-30 19:45:57
【问题描述】:

我正在开发一个 Web 应用程序,该应用程序具有多个具有相同架构的数据库。根据登录用户的不同,执行查询的数据库可能会有所不同。

我计划为每个数据库设置连接字符串,并且在存储库级别执行查询时,在创建数据库上下文时更改连接字符串。

我的问题是我尝试在执行 linq 查询之前将连接字符串名称动态传递给 DB 上下文,但失败了。

如果有人可以帮助我做到这一点,并让我知道这种方法的任何利弊,我将不胜感激。

【问题讨论】:

  • 请出示您的代码并解释实际发生的情况。你描述的应该有效。并且不要问“任何优点和缺点”,这会使这个问题过于宽泛。
  • DbContext-constructor 有一个接受连接字符串的参数。你为什么不用那个?在创建DbContext 的实例之前,您需要执行您的逻辑,根据登录的用户获取正确的连接字符串..
  • @PzYon 如果您阅读了这个问题,那似乎正是 OP 正在做的事情,至少我猜这就是 “将连接字符串名称动态传递给数据库上下文”的意思.
  • @CodeCaster jep,可以。但也可能是它们试图更改现有实例的连接字符串。也许我们需要更多信息甚至更好的代码示例?
  • @Thanushka 这样的架构可以用于多租户应用程序中,每个租户都有单独的数据库。

标签: c# entity-framework


【解决方案1】:

您可以简单地向接受连接字符串作为输入的数据库上下文构造函数添加一个重载:

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

然后当您需要创建数据库上下文的实例时,使用此重载并在连接字符串中注入合适的usernamepassword

例如,当您的连接字符串如下所示时:

var connectionTemplate = @"provider=System.Data.SqlClient;" +
                       @"provider connection string=""data source={0};" +
                       @"initial catalog=SERVERNAME;persist security info=True;" +
                       @"user id={1};password={2};" +
                       @"MultipleActiveResultSets=True;App=EntityFramework""";

然后您可以使用string.Format(connectionTemplate, DatabaseName, UserName, Password) 创建连接字符串并传递给您的数据库上下文的构造函数;

//You will provide Databasename, UserName, Password based on your logic
//for example based on the user who logged in application.
var connectionString= string.Format(connectionTemplate, DatabaseName, UserName, Password);
var db = new SampleDbEntities(connectionString);

【讨论】:

  • 我正在尝试使用相同的方法。我想为每个新用户生成不同的数据库。我以编程方式向配置文件添加了一个 conn 字符串。然后我打开 EntityState conn。但是当我尝试查询它时,它会在模型​​构建器中引发异常,因为“上下文正在代码优先模式下使用,代码是从 EDMX 文件生成的......”
  • @AwaisMahmood 对于连接多个数据库没有问题,它会这样做。我会看看你关于创建多个数据库的问题。
  • 好的。谢谢..如果我会发布我的问题,那么我会标记你。谢谢
  • @AwaisMahmood,这个问题解决了吗? stackoverflow.com/questions/32865627/…
  • @AwaisMahmood 我为您的问题发布了一个新答案here 希望它能解决您的问题并且对您有所帮助。
【解决方案2】:

要更改 DBContext 的连接字符串,您必须重写 DBContext 的构造函数。 您必须在参数中添加一个带有连接的构造函数(您之前定义的连接......)

ex : public MYEntities(EntityConnection entityConnection) :基础(实体连接,真){}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    • 2016-09-07
    • 1970-01-01
    相关资源
    最近更新 更多