我有一个使用Entity Framework 6.1.3在ASP MVC5.0中开发的Web应用程序。这是一个面向客户的网站。一切运行正常,但现在出现了新情况。另一个客户端将并排使用该应用程序。没有其他主机托管另一个应用程序的范围(这很简单)。大约有100个主表,并且与其他表(共250多个表)具有多个联接。 主要问题是任何表中都没有客户端标识符,我们现在无法获得它,因为这将是一场噩梦,因为它在所有表以及查询和存储过程中添加了客户端ID。
我们想出了一个可能的解决方案,将另一个数据库添加到站点并在其中登上新客户端。
配置文件中有一个名称为“ EFDBContext”的连接字符串,用于驱动应用程序。 我想在webconfig中添加另一个连接字符串(随着更多的客户端可以加入,可能会出现更多的连接字符串),我们无法弄清楚该如何实现。 因此,当一个客户端登录到主数据库时,其会话应重定向到其相应的数据库。
有人可能对此有所启示,无论是可行的还是任何解决方法? 非常感谢
答案 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]) { }
}
如果您尚未在应用程序中构建多租户,则绝对应该为每个客户端部署一个单独的数据库和代码。