【问题标题】:How create a database in azure elastic pool with entity framework core?如何在具有实体框架核心的 Azure 弹性池中创建数据库?
【发布时间】:2019-04-12 08:47:04
【问题描述】:

我想创建一个具有实体框架核心的数据库,该数据库将自动添加到我的天蓝色电子池中。

我使用 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 弹性池中创建数据库的原子操作。

【问题讨论】:

    标签: entity-framework-core azure-sql-database azure-sql-server azure-elasticpool


    【解决方案1】:

    我有一个非常相似的问题。幸运的是,我从之前的答案中得到了启发,我即兴创作了一个解决方案。

    我有一个通用数据库来管理应用程序,每当有新客户加入时,我都需要创建一个新数据库。因此,我必须在我的 .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);
    }
    

    【讨论】:

      【解决方案2】:

      Azure 弹性池支持您在现有池中或作为单个数据库创建新数据库。您必须连接到主数据库才能创建新数据库。

      更多详情请查看: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 语句再试一次。

      希望对你有帮助

      【讨论】:

      • 是的,但我正在寻找像这样使用实体框架(使用 DbContext)创建数据库。不使用 transact-SQL 命令。
      • 很抱歉,我没有找到关于使用实体框架(使用 DbContext)创建数据库的示例。但是你可以参考这些教程Create code to query the SQL database,使用create语句来达到你的目的。如果我的回答对你有帮助,你能接受吗?谢谢,祝你有美好的一天。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-13
      • 2016-10-29
      • 1970-01-01
      • 2019-05-11
      • 1970-01-01
      • 2022-01-28
      相关资源
      最近更新 更多