gpt4 book ai didi

c# - 如何在 EF Core 和 C# 中使用数据库分片"

转载 作者:行者123 更新时间:2023-12-03 14:40:49 28 4
gpt4 key购买 nike

我目前正在将我 6 岁的 C# 应用程序转换为 .NET Core v3 和 EF Core(也使用 Blazor)。
除了分片部分外,大部分都在工作。
我们的应用程序为每个客户创建一个新数据库。我们或多或少地使用了这个代码: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以及当我创建新客户端时如何创建新的分片/数据库。

最佳答案

在 EF.Core 中,只需解析 OnConfiguring 中的分片。例如

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
var con = GetTenantConnection(this.tenantName);

optionsBuilder.UseSqlServer(con,o => o.UseRelationalNulls());

base.OnConfiguring(optionsBuilder);
}

请注意,如果您有一个返回打开的 DbConnections 的服务或工厂,那么您需要在 DbContext.Dispose() 中关闭()/处置()它们。如果您获得连接字符串或关闭的连接,则 DbContext 将负责关闭连接。

ASP.NET Core 最佳实践可能需要注入(inject) ITenantConfiguration您的 DbContext 中的服务或类似的东西。但模式是一样的。只需将注入(inject)的服务实例保存到 DbContext 字段并在 OnConfiguring 中使用即可.

关于c# - 如何在 EF Core 和 C# 中使用数据库分片",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61632457/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com