Как динамически создать базу данных используя EF
Разбираюсь с репозиториями и зависимостями в ASP.NET Core MVC + C# + EF Core. Есть решение с тремя проектами, в котором в том числе и отделил бизнес логику от основного приложения.
Моя основная "боль" в том, что у каждого пользователя будет своя БД, и я должен динамически определять conectionString. Имя БД будет хранится в отдельной базе пользователей. Т.е. смысл следующий, после регистрации пользователь получает доступ к дополнительным функциям и создаётся отдельная БД, которую он наполняет по своему усмотрению. Как динамически создать БД имея её имя?
Интерфейс
public interface ICatalogRepository<T>
where T : class
{
string nameDataBase { get; set; }
void CreateDataBase(string nameDataBase);
IEnumerable<T> GetListObject(); // получение всех объектов
T GetObject(string id); // получение одного объекта по id
T GetObject(int id); // получение одного объекта по id
void Create(T item); // создание объекта
void Update(T item); // обновление объекта
void Delete(string roleId, string userId);
void Delete(string roleId);
void Save(); // сохранение изменений
}
Репозиторий
public class CatalogRepository<T> : ICatalogRepository<T>
where T : class
{
private CatalogDbContext _contextCatalog;
public string nameDataBase { get; set; }
public CatalogRepository(CatalogDbContext contextCatalog)
{
_contextCatalog = contextCatalog;
}
public void CreateDataBase(string nameDataBase)
{
using (_contextCatalog =
new CatalogDbContext($"Server=.\\SQLEXPRESS;Initial Catalog={nameDataBase};Integrated Security=True;"))
{
_contextCatalog.Database.EnsureCreated();
}
}
}
Контроллер, пока передаю строку таким образом, но это мне кажется не правильно, т.к. методов работы с БД на порядок больше, и передавать для каждого метода такой "геморой" не хочется:
public class HomeController : Controller
{
private readonly UserManager<ApplicationUser> _userManager;
readonly ICatalogRepository<Catalog> _contextCatalog;
public HomeController(UserManager<ApplicationUser> userManager, SignInManager<ApplicationUser> signInManager,
IRepository<ApplicationUser> context, ICatalogRepository<Catalog> contextCatalog)
{
_userManager = userManager;
_contextCatalog = contextCatalog;
}
public IActionResult CreateDb()
{
_contextCatalog.CreateDataBase(_context.GetObject(_userManager.GetUserId(User)).NameDataBase);
return RedirectToAction("Index");
}
}