Создание базы данных для каждого арендатора с использованием EF C # - PullRequest
0 голосов
/ 29 мая 2018

Я создаю мультитенантное приложение, используя 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Первый подход ??

Спасибо.

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Вот как я выполнил свое требование в настоящее время.

Когда любой новый пользователь / арендатор отправляет форму,

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

Пожалуйста, не стесняйтесь проверять этот подход и добавлять предложения.

Надеюсь, это поможет !!

0 голосов
/ 29 мая 2018

Похоже, у вас есть два вопроса.

  1. Как программно создать базу данных на SQL Server?

    Если вы не хотите, чтобы в вашем приложении были зависимостикод, вы можете запускать команды sql непосредственно на вашем сервере sql:

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

    Бам, вы получили свой новый БД, строка подключения для вашего нового БД будет "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)

Ваша задача будет состоять в использовании соответствующих строк соединения для соответствующих контекстов, в соответствии с которымиарендатор, с которым вы работаете.

...