【问题标题】:Multi-Tenancy System With Separate Databases in .Net Core.Net Core 中具有独立数据库的多租户系统
【发布时间】:2021-04-03 04:01:19
【问题描述】:

我正在尝试为每个租户策略创建实施数据库。但我不明白我实际上将如何做到这一点。我点击了这个链接https://www.codeproject.com/Articles/848111/Multi-Tenancy-System-With-Separate-Databases-in-MV,但我使用的是 asp.net core MVC。我是一个绝对的初学者。我如何为不同的用户创建一个单独的数据库。请帮忙。

【问题讨论】:

  • 我链接到的解决方案比下面的答案要好得多,因为连接字符串在接受的答案中是硬编码的。这对多租户解决方案没有帮助,您希望能够添加新租户而无需发布代码:gunnarpeipman.com/aspnet-core-database-per-tenant

标签: asp.net-mvc asp.net-core asp.net-core-mvc asp.net-core-2.2


【解决方案1】:

不确定您的模型设计如何,但您想要的是如何在项目中创建和使用多个数据库。

您可以按照以下步骤操作:

  • 创建第一个数据库

    1. 模型设计:

      public class Account
      {
          public int Id { get; set; }
          public string Name { get; set; }
      }
      
    2. 创建 DbContext:

      public class FirstContext : DbContext
      {
           public FirstContext (DbContextOptions<FirstContext> options)
               : base(options)
           {
           }
      
           public DbSet<Account> Account { get; set; }
      }
      
    3. 在 appsettings.json 中添加连接字符串:

      "ConnectionStrings": {
          "FirstContext": "Server=(localdb)\\mssqllocaldb;Database=FirstUser;Trusted_Connection=True;MultipleActiveResultSets=true"
      }
      
    4. 配置 Startup.cs:

       public class Startup
       {
           public Startup(IConfiguration configuration)
           {
               Configuration = configuration;
           }
      
           public IConfiguration Configuration { get; }
      
           public void ConfigureServices(IServiceCollection services)
           {
               services.Configure<CookiePolicyOptions>(options =>
               {
                   // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                   options.CheckConsentNeeded = context => true;
                   options.MinimumSameSitePolicy = SameSiteMode.None;
               });
               services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
      
                //add this...
               services.AddDbContext<FirstContext>(options =>
                   options.UseSqlServer(Configuration.GetConnectionString("FirstContext")));
           }
      
           public void Configure(IApplicationBuilder app, IHostingEnvironment env)
           {
      
               app.UseHttpsRedirection();
               app.UseStaticFiles();
               app.UseCookiePolicy();
      
               app.UseMvc(routes =>
               {
                   routes.MapRoute(
                       name: "default",
                       template: "{controller=Home}/{action=Index}/{id?}");
               });
           }
       }
      

    5.运行命令创建数据库(这种方式在EF Core中称为code-first):

    PM> add-migration init
    PM> update-database
    

    6.然后您可以在SQL Server Object Explorer中找到(localdb)\MSSQLLocalDB->Database中的数据库(在菜单选项卡中打开View->选择SQL Server Object Explorer):

  • 创建第二个数据库

    重复1-4步:

    型号:

    public class User
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
    

    数据库上下文:

     public class SecondContext : DbContext
     {
         public SecondContext(DbContextOptions<FirstContext> options)
             : base(options)
         {
         }
    
         public DbSet<User> User { get; set; }
     }
    

    appsettings.json:

    "ConnectionStrings": {
     "FirstContext": "Server=(localdb)\\mssqllocaldb;Database=FirstContext-ed05c500-1e05-4d2c-876d-02172e464153;Trusted_Connection=True;MultipleActiveResultSets=true",
     "SecondContext": "Server=(localdb)\\mssqllocaldb;Database=SecondUser;Trusted_Connection=True;MultipleActiveResultSets=true"
     }
    

    Startup.cs:

    services.AddDbContext<FirstContext>(options =>
                         options.UseSqlServer(Configuration.GetConnectionString("FirstContext")));
    
     //add this...
    services.AddDbContext<SecondContext>(options =>
                         options.UseSqlServer(Configuration.GetConnectionString("SecondContext")));
    

    不同的是你包含多个dbcontext,所以你需要在运行命令创建数据库时指定dbcontext名称:

    PM> add-migration init2 -context secondcontext
    PM> update-database -context secondcontext
    
  • 关于如何获取不同的用户数据:

    public class AccountsController : Controller
    {
         private readonly FirstContext _context;
         private readonly SecondContext _context2;
         public AccountsController(FirstContext context, SecondContext context2)
         {
             _context = context;
             _context2 = context2;
         }
    
         public async Task<IActionResult> Index()
         {
             var user1 = _context.Account.ToList();
             var user2 = _context2.User.ToList();
             return View();
         }
    }
    

【讨论】:

  • 我想创建一个应用程序,不同的用户动态地拥有不同的数据库。这个单独的数据库将在任何用户注册时动态创建。
  • 我很感激。但我需要一些不同的东西。例如:“StudentId, Student name, Phone No”假设这些是模型。不同的学生有不同的“StudentId, Student Name, Phone No”。当学生注册后登录他们的帐户时,他们会显示自己的姓名、身份证和电话号码,而不会显示其他学生的详细信息。
  • @David 我正在寻找 sam 功能,你找到什么了吗?
  • @MuhammadMaaz 我发现一篇文章正是我需要的关于 multitanent。如果你想要这个链接,你可以问我。我会提供这个链接。
  • 这个答案也对我有很大帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-11
  • 1970-01-01
  • 1970-01-01
  • 2015-11-28
  • 1970-01-01
相关资源
最近更新 更多