在同一个Web应用程序中使用多个SQL数据库

时间:2018-06-22 04:31:51

标签: asp.net-mvc entity-framework

我有一个使用Entity Framework 6.1.3在ASP MVC5.0中开发的Web应用程序。这是一个面向客户的网站。一切运行正常,但现在出现了新情况。另一个客户端将并排使用该应用程序。没有其他主机托管另一个应用程序的范围(这很简单)。大约有100个主表,并且与其他表(共250多个表)具有多个联接。 主要问题是任何表中都没有客户端标识符,我们现在无法获得它,因为这将是一场噩梦,因为它在所有表以及查询和存储过程中添加了客户端ID。

我们想出了一个可能的解决方案,将另一个数据库添加到站点并在其中登上新客户端。

配置文件中有一个名称为“ EFDBContext”的连接字符串,用于驱动应用程序。 我想在webconfig中添加另一个连接字符串(随着更多的客户端可以加入,可能会出现更多的连接字符串),我们无法弄清楚该如何实现。 因此,当一个客户端登录到主数据库时,其会话应重定向到其相应的数据库。

有人可能对此有所启示,无论是可行的还是任何解决方法? 非常感谢

2 个答案:

答案 0 :(得分:0)

只需在Webconfig中使用多个Database context,然后创建其上下文类并像使用

示例

内部webconfig连接字符串节点

 <connectionStrings>
<add name="DB1" connectionString="data source=YOURDATASOURCEHERE;initial catalog=CATALOGHERE; user id=USERNAMEHERE;password=PASSWORDHERE; multipleactiveresultsets=True;application name=EntityFramework" providerName="System.Data.SqlClient"/>

<add name="DB2" connectionString="data source=YOURDATASOURCEHERE;initial catalog=CATALOGHERE; user id=USERNAMEHERE;password=PASSWORDHERE; multipleactiveresultsets=True;application name=EntityFramework" providerName="System.Data.SqlClient"/>
 </connectionStrings>

然后为这些数据库创建两个上下文类,例如

 //DB1.CS
 public partial class DB1DataEntityContext : DbContext, IDisposable
{
    public DesignerDataEntityContext()
        : base("DB1")
    {


    }
     //Tables classes here

    public virtual DbSet<RatingTB> Rating { get; set; }
    public virtual DbSet<UsersTB> UsersTBs { get; set; }
    public static DB1DataEntityContext Create()
    {
        return new DB1DataEntityContext();

    }

}

//DB2.CS
public partial class DB2DataEntityContext : DbContext, IDisposable
{
      public DB2DataEntityContext()
        : base("DB2")
      {


       }
 //Tables classes here

       public virtual DbSet<RatingTB> Rating { get; set; }
       public virtual DbSet<UsersTB> UsersTBs { get; set; }
       public static DB2DataEntityContext Create()
       {
           return new DB2DataEntityContext();

        }

  }

使用方法

      public void executeQuery(string userType)
    {

        try
        {
            using (var db = new userType=="user1" ? DB1():DB2)
            {

               //query here
            }
        }
        catch (Exception ex)
        {

        }
    }

答案 1 :(得分:0)

如果我理解正确,那么您将创建数据库和应用程序(网络)代码的新实例。

在这种情况下,只需为部署的代码的每个实例更改连接字符串。 我不建议为每个客户端添加连接字符串。

如果将单个代码部署与多个数据库一起使用,那么您将需要在用户和数据库之间进行某种映射。您将如何知道要针对哪个数据库进行身份验证?

无论如何..假设您具有这样的映射,那么您确实可以将新的连接字符串添加到web.config ...

<connectionStrings>
    <add name="Client1" connectionString="..." providerName="System.Data.SqlClient"/>

    <add name="Client2" connectionString="..." providerName="System.Data.SqlClient"/>
</connectionStrings>

然后选择正确的字符串...

public class SiteDatabase: DbContext {
    public SiteDatabase() : base(_userToDatabaseMap[user]) { }
}

如果您尚未在应用程序中构建多租户,则绝对应该为每个客户端部署一个单独的数据库和代码。