0

我正在使用C# EF Code First approach.

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

这是注册页面的样子。

在此处输入图像描述

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 方法将此模型生成到表中?

谢谢。

4

2 回答 2

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

在您的代码中,当您需要访问这些表时,请使用

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

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

于 2018-05-29T12:40:17.830 回答
0

以下是我目前如何满足我的要求。

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

  1. 首先,我将用户/租户详细信息插入公共/主数据库
  2. 然后我在服务器上创建一个带有租户名称的新数据库。

提交行动:-

    [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);
    }

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

 public class TenantContext : DbContext
 {
    public TenantContext(string connection, Tenanat tenanat)
        : base(connection)
    {
        //create DB for tenant
        Database.CreateIfNotExists();
        //create user for the new Db
        string sql = "CREATE LOGIN \"" + tenanat.Email + "\" WITH PASSWORD = '" + tenanat.Password + "'; USE " + tenanat.Name + "; CREATE USER \"" + tenanat.Email + "\" FOR LOGIN \"" + tenanat.Email + "\" WITH DEFAULT_SCHEMA = dbo;";
        Database.ExecuteSqlCommand(sql);
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {


        base.OnModelCreating(modelBuilder);
    }

    public DbSet<Product> Products { get; set; }
    public DbSet<Order> Orders { get; set; }
   }}

请随时验证此方法并添加建议。

希望这可以帮助!!

于 2018-05-29T16:19:24.433 回答