我正在研究多租户ASP.NET MVC应用程序。 我有一个主数据库数据库,其中保存着所有租户的信息,然后每个客户都将拥有用于其个人交易的自定义数据库。
主数据库已为身份/登录生成了ASP.net表和名为tb_CustomerAccount的表。
在dbo.ASPNetUsers表中,我添加了一个名为AppUserID的列,该列是tb_CustomerAccount表的外键。
此表具有以下字段 AppUserID, 数据库名称, SQL_Server, 用户身份, 密码
当用户登录时,系统将识别用户并查找其数据库,并将用户连接到其应用程序界面。
现在这在我的本地计算机上可以正常工作,但是当我托管该应用程序时,出现错误“无效的对象名称'dbo.AspNetUsers'”。 难以解决问题,似乎登录名正在查看演示租户数据库中的登录详细信息,而不是主数据库,我不知道为什么,
private Master_DatabaseEntities db = new Master_DatabaseEntities();
[Authorize]
public ActionResult Index()
{
string userID;
string CustomerDatabase;
long CusID;
userID = Convert.ToString(User.Identity.GetUserId());
AspNetUser aspNetUser = db.AspNetUsers.Find(userID);
CusID = Convert.ToInt64(aspNetUser.CustomerID);
LogIn_userID = aspNetUser.Id;
CustomerName = aspNetUser.ussCustomerAccount.Name;
CustomerDatabase = aspNetUser.ussCustomerAccount.Database;
ussCustomerAccount ussCustomerAccount = db.ussCustomerAccounts.Find(CusID);
var db_Connection_Details = new DynamicModel.DataContext(ussCustomerAccount.Server, ussCustomerAccount.Database, ussCustomerAccount.User, ussCustomerAccount.Password);
return View();
}
DbContext:
public class DataContext : DbContext
{
public DataContext(string server, string database, string user, string password)
: base ("metadata=res://*/Models.DemoCompanyDB.csdl|res://*/Models.DemoCompanyDB.ssdl|res://*/Models.DemoCompanyDB.msl;provider=System.Data.SqlClient;provider connection string='data source=" + server + ";initial catalog=" + database + ";user id=" + user + ";password=" + password + ";MultipleActiveResultSets=True;App=EntityFramework'")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
public virtual DbSet<xxx> xxx
{
get;
set;
}
public virtual DbSet<xxx> xxx
{
get;
set;
}
public virtual DbSet<xxx> xxx
{
get;
set;
}
答案 0 :(得分:0)
问题出在Master_Database连接字符串。 连接字符串指向DemoCompany而不是@MohsinMehmood指示的Master_Database。
希望这会帮助完成类似任务的人。 谢谢