使用EF C#为每个租户生成数据库#

时间:2018-05-29 09:32:48

标签: c# asp.net entity-framework ef-code-first

我正在使用C# EF Code First approach构建多租户应用程序。

我选择单独的每个租户数据库。在这方面,当应用程序加载租户时可以登录或注册。

这就是注册页面的样子。

enter image description here

在提交时,我会在名为MyAppDB&的公共数据库中捕获此租户详细信息。表tblTenants

此处租户名称是唯一的&成功提交表单后,我需要在租户名称和服务器的同一台服务器上创建新的数据库。为模型生成一组表。

这是我的模型,对于每个租户来说都是如此。

public class Product
{
   public int Id { get; set;}

   public string Name { get; set;}
}

public class Sales
{
   public int Id { get; set;}

   public string Name { get; set;}
}

如何使用C#EF Code First方法生成此模型到表?

感谢。

2 个答案:

答案 0 :(得分:0)

好像你有两个问题。

  1. 如何在SQL Server上以编程方式创建数据库?

    如果你不想在你的代码中有任何依赖,你可以直接对你的sql server运行run sql命令:

    using (var connection = new SqlConnection(myConnectionString))
    {
          connection.Open();
          var command = connection.CreateCommand();
          command.CommandText = "CREATE DATABASE mydb";
          command.ExecuteNonQuery();
    }
    

    Bam你得到了新的数据库,你的新数据库的连接字符串将是"Data Source=ServerName;Initial Catalog=mydb;Integrated Security=False;User Id=sa;Password=password;MultipleActiveResultSets=True"

  2. 如何使用EF代码优先在新数据库中创建表?

    你不一定,你让EF处理这件事。

    创建tenantdbcontext类:

    public class TenantDbContext : DbContext
    {
        public TenantDbContext () : Base("name=yourConnString") { }
    
        public DbSet<Product> Products { get; set; }
        public DbSet<Sales> Sales { get; set; }
    }
    
  3. 在您需要访问这些表的代码中使用

    TenantDbContext tdc = new TenantDbContext();
    tdc.Products.Add(new Product)
    

    您的挑战将是根据您正在使用的租户使用适当的连接字符串到适当的上下文。

答案 1 :(得分:0)

以下是我目前处理我的要求的方法。

当任何新用户/租户提交表单时,

  1. 首先,我将用户/租户详细信息插入common / master DB
  2. 然后我在服务器上创建一个带有租户名称的新数据库。
  3. 提交行动: -

    A.h

    这就是我的TenantContext类,它处理主要内容以按需生成数据库。

        [HttpPost]
        public ActionResult CreateTenant(Tenanat tenanat)
        {
            //Master/Common DB
            using (DataContext ctx = new DataContext())
            {
                ctx.Tenanats.Add(tenanat);
                ctx.SaveChanges();
                string con = ConfigurationManager.ConnectionStrings["tenantContext"].ConnectionString;
                con = con.Replace("tenDbName", tenanat.Name.Trim());
    
                TenantContext tenantContext = new TenantContext(con,tenanat);
            }
            return RedirectToAction("Index", "Tenanat",tenanat);
        }
    

    请随意验证此方法&amp;添加建议。

    希望这会有所帮助!!