0

我正在构建一个SAAS应用程序,并计划为每个客户端一个数据库。我在ASP.Net MVC 4中使用Code First EF6。多租户多数据库,代码优先EF 6和ASP.Net MVC 4

将会有2个上下文,即MasterContext和TenantContext。用户将首先打到MasterContext以验证用户凭证并获取其租户配置。

根据提取的租户配置; TenantContext设置为Tenant特定数据库并用于Tenant CRUD操作。

请教如何做到这一点。

回答

0

这个想法是确定当前请求tenant_id并使用它来获取数据库配置并创建DbContext,如下面的代码。

public AppDbContext : DbContext 
{ 
    private const string _defaultCS = "default app connection string"; 

    public AppDbContext() : base(GetConnectionString()) 
    { 
    } 

    private string GetConnectionString() 
    { 
     return TenantContext.ConnectionString ?? _defaultCS; 
    } 
} 

使用范例

public class StudentRepo 
{ 
    public Student Get(Guid id) 
    { 
     using(var ctx = new AppDbContext()) 
     { 
      return ctx.Students.FirstOrDefault(x=>x.Id == id); 
     } 
    } 
} 

这将自动连接到登录的用户数据库。

您可能需要tenant_id存储在验证cookie,并PostAuthenticate_Event后读取并将其存储在HttpContext.Current.Items

public static TenantContext 
{ 
    public static Guid TenantId 
    { 
     get 
     { 
      return (Guid)HttpContext.Current.Items["__TenantID"]; 
     } 
    } 

    public static string ConnectionString 
    { 
     get 
     { 
      return TenantConfigService.GetConnectionString(TenantId); 
     } 
    } 
} 

在某些HTTP模块初始化方法

context.PostAuthenticateRequest += context_PostAuthenticateRequest; 

void context_PostAuthenticateRequest(object sender, EventArgs e) 
{ 
    FormsIdentity identity = Thread.CurrentPrincipal.Identity as FormsIdentity; 

    if (identity != null) 
    { 
     HttpContext.Current.Items["__TenantID"] = GetTenantIdFromTicket(identity.Ticket.UserData); // returns tenant_id as guid type 
    } 
} 
+0

你能分享一些工作样品。 –

+0

以上代码是工作示例的摘录。如果您需要完整的工作示例,那么我推荐techcello.com,他们在.NET中有一个非常棒的SaaS框架,这可能是您需要的。 – cackharot