我想用实体Framework核心创建一个数据库,该数据库将自动添加到我的Azure精细池中。
我使用DatabaseFacadeExtension来做到这一点,该数据库在创建数据库后执行SQL命令,如下所示: Azure SQL Server Elastic Pool - automatically add database to pool
public static async Task<bool> EnsureCreatedAsync(this DatabaseFacade databaseFacade, string elasticPoolName, CancellationToken cancellationToken = default)
{
if (!await databaseFacade.EnsureCreatedAsync(cancellationToken)) return false;
// the database has been created.
var dbName = databaseFacade.GetDbConnection().Database;
try
{
cancellationToken.ThrowIfCancellationRequested();
if (!string.IsNullOrEmpty(elasticPoolName))
{
await databaseFacade.ExecuteSqlCommandAsync(new RawSqlString(
$"ALTER DATABASE {dbName} MODIFY ( SERVICE_OBJECTIVE = ELASTIC_POOL (name = [{elasticPoolName}] ));"),
cancellationToken);
}
return true;
}
catch
{
await databaseFacade.EnsureDeletedAsync(cancellationToken);
throw;
}
}
可以,但是我更喜欢原子操作,在该操作中可以直接在Azure弹性池中创建数据库。
答案 0 :(得分:0)
Azure Elastic Pool支持您在现有池中或作为单个数据库创建新数据库。您必须连接到master数据库才能创建新数据库。
有关更多详细信息,请参见:Transact-SQL:Manage pooled databases。
示例T-SQL代码:
在弹性池中创建数据库
CREATE DATABASE db1 ( SERVICE_OBJECTIVE = ELASTIC_POOL ( name = S3M100 ) ) ;
请参阅:Azure SQL Database single database/elastic pool
您可以替换T-SQL语句,然后重试。
希望这会有所帮助
答案 1 :(得分:0)
我有一个非常相似的问题。幸运的是,我从之前的答案中得到了提示,并即兴发挥了它的作用以找到解决方案。
我有一个通用数据库来管理应用程序,每当有新客户端加入时,我都需要创建一个新数据库。因此,我必须在我的 .NET 核心应用程序中维护多个数据库上下文。此外,我在我的代码库中准备了 clientContext 的迁移,这只是需要
client_db.Database.MigrateAsync();
创建数据库。但是,我无法直接在弹性池下创建它,因为 Azure 没有任何支持它的默认设置。因此,MigrateAsync 总是在池外创建数据库。
因此,我使用通用数据库上下文中的 T-SQL 命令在池中创建了数据库,然后使用 MigrateAsync() 迁移所有必需的架构。
var commandText = "CREATE DATABASE client1 ( SERVICE_OBJECTIVE = ELASTIC_POOL ( name = demoPool ) );";
db.Database.ExecuteSqlCommand(commandText);
clientContext client_db = new clientContext(approved_corporate.Id, _configuration);
client_db.Database.MigrateAsync();
我的 clientContext 中还有一个自定义构造函数来支持这个:
public clientContext(int client_id, IConfiguration configuration = null)
{
string client_code = "client" + client_id.ToString();
connection_string = configuration["ConnectionStrings:Client"].ToString().Replace("client_code", client_code);
}