Подзапрос возвратил более 1 ошибки значения при использовании Update-Database в Entity Framework

Я использую Entity Framework и пытаюсь запустить миграцию базы данных из консоли диспетчера пакетов в Visual Studio. Когда я это сделаю, я получаю следующую ошибку и трассировку стека.

Я не могу понять, что здесь происходит. Запуск оператора SQL напрямую работает нормально

Так выглядит файл миграции

ALTER TABLE [dbo].[TableName] ADD [ColumnName] [bit] NOT NULL DEFAULT 0

Если я затем закомментирую содержимое Up() в файле миграции, я смогу успешно запустить (пустую) миграцию.

public partial class MigrationName : DbMigration
{
    public override void Up()
    {
        AddColumn("dbo.TableName", "ColumnName", c => c.Boolean(nullable: false));
    }

    public override void Down()
    {
        DropColumn("dbo.TableName", "ColumnName");
    }
}

Кроме того, если я запускаю все миграции, включая эту, с пустой базой данных, все работает нормально. Таким образом, существует некоторая проблема с данными, которая вызывает ошибку (что ожидается, учитывая сообщение об ошибке).

Я попытался посмотреть на SQL Server Profiler, чтобы попытаться выяснить, какой SQL выполняется, но ничего не отображается.

У меня есть около 20 других миграций, которые хорошо работали до этого момента, но эта и предыдущая постоянно выдают эту ошибку.

Кто-нибудь знает, в чем может заключаться основная проблема, или как я могу получить дополнительную информацию о том, что идет не так?

В моей строке подключения было установлено 1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action. Удаление этого из строки подключения решило проблему.


person Kris Harper    schedule 06.12.2016    source источник
comment
@Blorgbeard Хороший вопрос. Есть, но если я его отброшу, миграция также не удастся.   -  person Blorgbeard    schedule 06.12.2016
comment
Ну, столбца не существует, поэтому я пытаюсь его добавить. Если вы измените миграцию на вашу, вы получите _1_   -  person Kris Harper    schedule 06.12.2016


Ответы (3)


Вы пытались сами написать миграцию. Я бы сделал что-то подобное

person Kris Harper    schedule 27.12.2016

ИЛИ просто добавьте столбец

public override void Up()
{
    DropColumn("dbo.TablaName", "ColumnName");
    AddColumn("dbo.TableName", "ColumnName", c => c.Boolean(nullable: false));
}

OR

public override void Up()
{
    AlterColumn("dbo.TableName", "ColumnName", c => c.Boolean(nullable: false));
}

Я бы оставил Даун пустым.

 public override void Up()
{
    DropColumn("dbo.TablaName", "ColumnName");
    AddColumn("dbo.TableName", "ColumnName", c => c.Boolean(nullable: false));
}

Ваше здоровье!

public override void Down(){}

Изменение строки подключения также сработало для меня, как предлагал Крис, но я был обеспокоен тем, как это повлияет на что-либо еще, использующее ту же строку подключения.

person Victor A Chavez    schedule 06.12.2016
comment
Итак, если то, что вы пытаетесь сделать, это просто столбец, просто используйте ALTER TABLE DROP COLUMN failed because column 'ColumnName' does not exist in table 'TableName'. и оставьте Вниз пустым - person Kris Harper; 07.12.2016
comment
К вашему сведению, вам нужно заменить ColumnName на имя используемого вами столбца. - person Victor A Chavez; 07.12.2016
comment
Это именно то, что я имею в своем вопросе. - person Victor A Chavez; 07.12.2016
comment
Хорошо, сколько у вас файлов миграции? потому что, если у вас есть ожидающие файлы миграции, это не сработает. Итак, попробуйте найти, есть ли у вас ожидающая миграция, кроме последней. - person Kris Harper; 07.12.2016
comment
Это единственное, что не применялось. - person Victor A Chavez; 07.12.2016
comment
Вы пытаетесь запустить профилировщик Sql и проверить, отправляет ли EF запрос или нет ли события до этой точки. - person Kris Harper; 07.12.2016
comment
Я записал вывод в Profiler и без ошибок запустил все зарегистрированные там запросы. Сначала он выполняет несколько запросов к таблице _1_, а затем выполняет оператор _2_. Но на самом деле этот оператор не применяется, и не регистрируется ни один запрос, приводящий к указанной выше ошибке. - person Victor A Chavez; 09.12.2016
comment
Можете ли вы сначала опубликовать строку подключения, которую вы используете для своего кода? - person Kris Harper; 09.12.2016
comment
Привет, @KrisHarper. На этом этапе я пытаюсь решить с вами проблему. Итак, когда я сначала пишу код, я использую эту строку подключения '' - person Victor A Chavez; 09.12.2016
comment
Привет, @KrisHarper. На этом этапе я пытаюсь решить с вами проблему. Итак, когда я сначала пишу код, я использую эту строку подключения _1_ - person Victor A Chavez; 12.12.2016
comment
PM> Update-Database -Verbose Использование StartUp проекта 'Project'. Используя проект NuGet DataModels. Укажите флаг «-Verbose» для просмотра операторов SQL, применяемых к целевой базе данных. Целевая база данных: «База данных» (Источник данных: Сервер, Поставщик: System.Data.SqlClient, Источник: Конфигурация). Применение явных миграций: [201612061704158_MigrationName]. Применение явной миграции: 201612061704158_MigrationName. ALTER TABLE [dbo]. [TableName] ADD [ColumnName] [bit] NOT NULL DEFAULT 0 System.Data.SqlClient.SqlException (0x80131904): подзапрос вернул более 1 значения. Это не разрешено, если подзапрос следует за =,! =, ‹,‹ =,>,> = Или когда подзапрос используется как выражение. Заявление было прекращено. в System.Data.SqlClient.SqlConnection.OnError (исключение SqlException, логическое breakConnection, Actionserver=testvalue;Database=testvalue; Integrated Security=true; MultipleActiveResultSets=True; App=EntityFramework;" providerName="System.Data.SqlClient" 1 wrapCloseInAction) в System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning (TdsParserState.Darser.ThrowExceptionAndWarning (TdsParserState. (runBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader DATASTREAM, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, булева & dataReady) при System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds (String имяМетод, булева асинхронной, Int32 тайм-аут, булева asyncWrite) при System.Data.SqlClient.SqlCommand .InternalExecuteNonQuery (TaskCompletionSource_2_1 c) в операции System.Data.Entity.Infrastructure.Interception.InternalDispatcher_3_3, контекст перехвата TInterceptionContext, выполняется действие_4_3) в System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher, команда DbCommandDispatcher. ceptionContext interceptionContext) в System.Data.Entity.Internal.InterceptableDbCommand.ExecuteNonQuery ()
в System.Data.Entity.Migrations.DbMigrator.ExecuteSql (MigrationStatement migrationStatement, соединение DbConnection, транзакция DbTransactionConception), транзакция DbConnection в System.DbTransactionConception. Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ExecuteSql (MigrationStatement migrationStatement, соединение DbConnection, транзакция DbTransaction, контекст перехвата DbInterceptionContext) в System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsContextTransaction, DbMigrator. Data.Entity.Migrations.DbMigrator.ExecuteStatementsWithinNewTransaction (IEnumerable_6_1 migrationStatements, соединение DbConnection, DbInterceptionContext interceptionContext) в System.Data.Entity.Migrations.DbMigrator.ExecuteStatements.ExecuteStatements. ) в System.Data.Entity.Migrations.DbMigrator.ExecuteStatements (IEnumerable_8_1 migrationStatements) в System.Data.Entity.Migrations.Infrastructure.MigratorBase.ExecuteStatements (операции IEnumerable_9_1, IEnumerable_9_1 операции, String targetMigrations_10_1 pendingMigrations. Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade (IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId)
в System.Data.Entity.Migrations.DbMigrator.UpdateInternal (String targetMigrations) в System.Data.Entity.Entity .DbMigrator. ‹> C__DisplayClassc.b__b () в System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists (действие mustSucceedToKeepDatabase) в System.Data.Entity.Migrations.Infrastructure.MigratorBase.EnsureDatabaseExists (действие должно быть. DbMigrator.Update (String targetMigration) в System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update (String targetMigration) в System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.Run () в System.AppDomain.DoCall CrossAppDomainDelegate callBackDelegate) в System.AppDomain.DoCallBack (CrossAppDomainDelegate callBackDelegate)
в System.Data.Entity.Migrations.Design.ToolingFacade.Run (бегун BaseRunner) в System.Data.Entity.Migrations.Design targetMigration, Boolean force) в System.Data.Entity.Migrations.UpdateDatabaseCommand. ‹> c__DisplayClass2.‹. ctor> b__0 () в System.Data.Entity.Migrations.MigrationsD omainCommand.Execute (команда действия) ClientConnectionId: 40e2fc22-5bbd-4d83-88f3-ce5b2bc378dc Номер ошибки: 512, состояние: 1, класс: 16 Подзапрос вернул более одного значения. Это не разрешено, если подзапрос следует за =,! =, ‹,‹ =,>,> = Или когда подзапрос используется как выражение. Заявление было прекращено. - person Victor A Chavez; 12.12.2016

Что также сработало для меня, так это очистить методы Up() и Down(), запустить миграцию и вернуться к предыдущей миграции с помощью update-database -targetmigration:"PreviousMigrationName". Как только это было сделано, я мог воссоздать миграцию и запустить ее, не меняя строку подключения.

Есть ли триггеры на Up()?

person Kyle Boldiston    schedule 07.06.2018