Ну, это похоже на блог, а не на вопрос переполнения стека ... Я отвечаю на свои вопросы, но если это может помочь только одному человеку ... Это было очень продуктивное воскресенье.
После прочтения большого количества статей я выясняю, что лучший способ получить основной DbContext при инициализации арендатора DbContext - использовать поставщик услуг, чтобы получить его как внедренную зависимость.
IServiceProvider serviceProvider
public class DbContextTenant : IdentityDbContext<ApplicationUser, ApplicationRole, int>, IDbContextTenant
{
private readonly string _connectionString;
public DbContextTenant(DbContextOptions<SpzContextClient> options,
IHttpContextAccessor contextAccessor, IServiceProvider serviceProvider) : base(options)
{
var tenantId = (int)contextAccessor.HttpContext.Items["TenantId"];
_connectionString = contextAccessor.HttpContext.Items["DbString"].ToString();
TenantInitialization.Initialize(serviceProvider, this, tenantId);
}
Как видите, я передаю serviceProvider для инициализации базы данных клиентов. Таким образом, я могу использовать основной DbContext при инициализации другого DbCOntext, который обращается ко всем арендаторам.
Инициализация будет примерно такой.
public static void Initialize(IServiceProvider serviceProvider, DbContextTenant context, int tenantId)
{
if (((RelationalDatabaseCreator) context.GetService<IDatabaseCreator>()).Exists()) return;
context.Database.EnsureCreated();
LanguageInitialization.Initialize(context);
CountryInitialization.Initialize(context);
using (var DbContext = serviceProvider.GetRequiredService<DbContext>())
{
CompanyInitialization.Initialize(context, contextMaster, tenantId);
}
context.SaveChanges();
}
Если вы знаете лучший способ сделать это, пожалуйста, дайте мне знать.
Если база данных уже существует, она ничего не делает. Это только первый раз, когда кто-то получает доступ к сайту арендатора, поэтому мы можем просто добавить арендатора в базу данных, и приложение создаст саму базу данных. Таким способом действительно легко создавать новых клиентов (арендаторов), просто добавив строку в таблицу клиентов основной базы данных.
Создает базу данных и инициализирует нужные нам таблицы, такие как языки, страны ... и компанию, получая всю информацию из таблицы Client основного DbContext.
Это мультитенантное приложение, asp.net core 2, единая установка кода, одна основная база данных и одна база данных для каждого арендатора. Каждый арендатор имеет свой домен, поэтому мы используем хост для различия между арендаторами.
У меня было много проблем, чтобы попасть сюда, поэтому я делюсь этим, если кому-то это нужно. Я бы хотел иметь всю информацию, которая у меня есть сейчас. Если у вас есть какие-либо вопросы или вам нужен код, я хотел бы поделиться всем, что вам нужно.