【问题标题】:Multi Database for Multi Tenant with Code first EF 6 and ASP.Net MVC 4使用 Code first EF 6 和 ASP.Net MVC 4 的多租户多数据库
【发布时间】:2014-05-12 06:34:17
【问题描述】:

我正在构建一个 SAAS 应用程序,并计划为每个客户端一个数据库。我在 ASP.Net MVC 4 中使用 Code First EF6。

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

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

请告知如何实现这一目标。

【问题讨论】:

    标签: c# asp.net-mvc-4 entity-framework-6 ef-code-first multi-tenant


    【解决方案1】:

    这个想法是识别当前请求的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 存储在Auth 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 模块的 Init 方法中

    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
        }
    }
    

    【讨论】:

    • 以上代码是工作示例的摘录。如果您需要完整的工作示例,那么我推荐 techcello.com,他们在 .NET 中有一个很棒的 SaaS 框架,这可能是您所需要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    相关资源
    最近更新 更多