В настоящее время я занимаюсь преобразованием своего 6-летнего приложения C# в .NET Core v3 и EF Core (а также с использованием Blazor). Большая его часть работает, за исключением части Sharding.
Наше приложение создает новую базу данных для каждого клиента. Мы используем для этого примерно такой код: https://docs.microsoft.com/en-us/azure/sql-database/sql-database-elastic-scale-use-entity-framework-applications-visual-studio
Сейчас я пытаюсь преобразовать его в EF Core, но застреваю на этом этапе:
// C'tor to deploy schema and migrations to a new shard
protected internal TenantContext(string connectionString)
: base(SetInitializerForConnection(connectionString))
{
}
// Only static methods are allowed in calls into base class c'tors
private static string SetInitializerForConnection(string connnectionString)
{
// We want existence checks so that the schema can get deployed
Database.SetInitializer<TenantContext<T>>(new CreateDatabaseIfNotExists<TenantContext<T>>());
return connnectionString;
}
// C'tor for data dependent routing. This call will open a validated connection routed to the proper
// shard by the shard map manager. Note that the base class c'tor call will fail for an open connection
// if migrations need to be done and SQL credentials are used. This is the reason for the
// separation of c'tors into the DDR case (this c'tor) and the internal c'tor for new shards.
public TenantContext(ShardMap shardMap, T shardingKey, string connectionStr)
: base(CreateDDRConnection(shardMap, shardingKey, connectionStr), true /* contextOwnsConnection */)
{
}
// Only static methods are allowed in calls into base class c'tors
private static DbConnection CreateDDRConnection(ShardMap shardMap, T shardingKey, string connectionStr)
{
// No initialization
Database.SetInitializer<TenantContext<T>>(null);
// Ask shard map to broker a validated connection for the given key
var conn = shardMap.OpenConnectionForKey<T>(shardingKey, connectionStr, ConnectionOptions.Validate);
return conn;
}
Приведенный выше код не компилируется, поскольку объект базы данных не существует таким образом в EF Core. Я предполагаю, что могу упростить это, используя TenantContext.Database.EnsureCreated();
где-нибудь. Но я не могу понять, как изменить методы, какие удалить, какие изменить (и как).
Конечно, я искал пример использования сегментирования и EF Core, но не смог его найти. Кто-нибудь здесь делал это раньше в EF Core и хочет поделиться?
Я специально ищу, что добавить в startup.cs
и как создать новый сегмент/базу данных при создании нового клиента.