MigratorDotNet Alter База данных требуется, но не может быть использована

Я немного озадачен и надеюсь, что кто-то здесь может помочь.

Я унаследовал старый проект, и он использует MigratorDotNet для развертывания базы данных. Во время тестирования развертывания (сейчас мы используем Octopus в качестве системы развертывания) проекта, я начал получать сообщения о том, что посредник не включен, что привело к сбою приложения. Я создал миграцию для включения посредника в базе данных, но созданная для него миграция возвращает ошибку, в которой говорится, что "оператор ALTER DATABASE не разрешен в транзакции с несколькими операторами".

Вот миграция:

 [CLSCompliant(false)]
[Migration(201608121015)]
public class EnableSqlServiceBroker : Migration
{
    public override void Down()
    {
        var assemblyRoot = System.Reflection.Assembly.GetExecutingAssembly().Location;
        var webConfigFileLocation = Path.Combine(assemblyRoot.Substring(0, assemblyRoot.IndexOf("\\bin")), "Web.config");
        var configuration = ConfigurationManager.OpenMappedExeConfiguration(new ExeConfigurationFileMap { ExeConfigFilename = webConfigFileLocation }, ConfigurationUserLevel.None);
        var appSettings = (configuration.GetSection("appSettings") as AppSettingsSection);

        var databaseName = appSettings.Settings[Constants.DatabaseName].Value;
        var stringBuilder = new StringBuilder()
            // Declare the BrokerEnabled variable and set it
            .AppendLine("DECLARE @BrokerEnabled bit")
            .AppendLine("SET @BrokerEnabled = 0")
            .AppendLine(
                string.Format("SELECT @BrokerEnabled =  is_broker_enabled FROM sys.databases WHERE name = '{0}'",
                    databaseName))
            .AppendLine("IF(@BrokerEnabled = 1)")
            .AppendLine("BEGIN")
            // disable the broker
            .AppendLine(string.Format("   ALTER DATABASE [{0}] SET DISABLE_BROKER", databaseName))

            .AppendLine("END");
        Database.ExecuteNonQuery(stringBuilder.ToString());
    }

    public override void Up()
    {
        var assemblyRoot = System.Reflection.Assembly.GetExecutingAssembly().Location;
        var webConfigFileLocation = Path.Combine(assemblyRoot.Substring(0, assemblyRoot.IndexOf("\\bin")), "Web.config");
        var configuration = ConfigurationManager.OpenMappedExeConfiguration(new ExeConfigurationFileMap { ExeConfigFilename = webConfigFileLocation }, ConfigurationUserLevel.None);
        var appSettings = (configuration.GetSection("appSettings") as AppSettingsSection);

        var databaseName = appSettings.Settings[Constants.DatabaseName].Value;
        var stringBuilder = new StringBuilder()
            // Declare the BrokerEnabled variable and set it
            .AppendLine("DECLARE @BrokerEnabled bit")
            .AppendLine("SET @BrokerEnabled = 0")
            .AppendLine(string.Format("SELECT @BrokerEnabled =  is_broker_enabled FROM sys.databases WHERE name = '{0}'", databaseName))
            .AppendLine("IF(@BrokerEnabled = 0)")
            .AppendLine("BEGIN")
            // enable the broker
            .AppendLine(string.Format("     ALTER DATABASE [{0}] SET ENABLE_BROKER", databaseName))

            .AppendLine("END");
        Database.ExecuteNonQuery(stringBuilder.ToString());
    }
}

Я не могу включить посредника без изменения базы данных, но я не могу изменить базу данных, потому что это явно не разрешено. Кто-нибудь знает способ обойти эту проблему? Или исправить это? Заранее спасибо.

1 ответ

Вы должны зафиксировать уже запущенную транзакцию перед изменением базы данных.

Другие вопросы по тегам