2016-12-06 3 views
1

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

PM> Обновление-База данных - Использование проекта StartUp «Проект». Использование Проект NuGet 'DataModels'. Укажите флаг '-Verbose', чтобы просмотреть операторы SQL , применяемые к целевой базе данных. Целевая база данных : «База данных» (DataSource: Server, Provider: System.Data.SqlClient, Происхождение: Конфигурация). Применение явных миграций: [201612061704158_MigrationName]. Применение явной миграции: 201612061704158_MigrationName. ALTER TABLE [dbo]. [TableName] ADD [ColumnName] [бит] NOT NULL DEFAULT 0 System.Data.SqlClient.SqlException (0x80131904): Подзапрос возвращает более одного значения. Это недопустимо, когда подзапрос следует = ! =, <, < =,>,> = или когда подзапрос используется как выражение. Заявление прекращено. в System.Data.SqlClient.SqlConnection.OnError (SqlException исключения, булевой breakConnection, действия 1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action 1 wrapCloseInAction) в System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning (TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) в системы. Data.SqlClient.TdsParser.TryRun (RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader DATASTREAM, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, булева & dataReady) при System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds (String имяМетода, булева асинхронной, Int32 timeout, Boolean asyncWrite) в System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery (TaskCompletionSource 1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry) at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.<NonQuery>b__0(DbCommand t, DbCommandInterceptionContext 1 с) по System.Data.Entity.Infrastructure.Interception.InternalDispatcher 1.Dispatch[TTarget,TInterceptionContext,TResult](TTarget target, Func 3 операции, TInterceptionContext interceptionContext, Действие 3 executing, Action 3 выполнены) в System.Data.Entity. Infrastructure.Interception.DbCommandDispatcher.NonQuery (DbCommand команды, DbCommandInterceptionContext interceptionContext) при System.Data.Entity.Internal.InterceptableDbCommand.ExecuteNonQuery()
на System.Data.Entity.Migrations.DbMigrator.ExecuteSql (migrationStatement migrationStatement, Соединение DbConnection, DbTransaction транзакции, DbInterceptionContext interceptionContext) при System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ExecuteSql (MigrationStatement migrationStatement, DbConnection соединения, DbTransaction сделки, DbInterceptionContext interceptionContext) в System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal (IEnumerable migrationStatements, DbTransaction сделки, DbInterceptionContext interceptionContext) при System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsWithinNewTransaction (IEnumerable migrationStatements, DbConnection соединение, DbInterceptionContext interceptionContext) на System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal (IEnumerable)) System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Выполнить (Действие операции) на System.Data.Entity.Migrations.DbMigrator.ExecuteStatements (IEnumerable migrationStatements) на System.Data.Entity.Migrations.Infrastructure.MigratorBase.ExecuteStatements (IEnumerable 1 migrationStatements) at System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, VersionedModel targetModel, IEnumerable 1 операций, IEnumerable pendingMigrations, String targetMigrationId, Строка lastMigrationId)
на System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade (IEnumerable`1 pendingMigrations, Строка targetMigrationId, Строка lastMigrationId)
в System.Data.Entity.Migrations .DbMigrator.UpdateInternal (Стри ng targetMigration) в System.Data.Entity.Migrations.DbMigrator. <> c__DisplayClassc.b__b() в System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists (Action mustSucceedToKeepDatabase) в System.Data.Entity.Migrations.Infrastructure.MigratorBase.EnsureDatabaseExists (Action mustSucceedToKeepDatabase) в системе. Data.Entity.Migrations.DbMigrator.Update (String targetMigration) на System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update (Строка targetMigration) в System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner. Run() в System.AppDomain.DoCallBack (CrossAppDomainDelegate callBackDelegate) по адресу Sys tem.AppDomain.DoCallBack (CrossAppDomainDelegate callBackDelegate)
на System.Data.Entity.Migrations.Design.ToolingFacade.Run (BaseRunner литниковой) в System.Data.Entity.Migrations.Design.ToolingFacade.Update (String targetMigration, Boolean force) в System.Data.Entity.Migrations.UpdateDatabaseCommand. <> c__DisplayClass2. < .ctor> b__0() на System.Data.Entity.Migrations.MigrationsDomainCommand.Execute (Действие команды) ClientConnectionId: 40e2fc22-5bbd-4d83-88f3-ce5b2bc378dc Ошибка Номер: 512, состояние: 1, Класс: 16 Подзапрос возвратил более 1 значения. Этот не разрешен, если подзапрос следует в следующем выражении: =,! =, <, < =,>,> = или , когда подзапрос используется как выражение. Заявление было завершено .

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

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

Это то, что файл миграции выглядит

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"); 
    } 
} 

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

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

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

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

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

+0

Есть ли триггеры в '[TableName]'? – Blorgbeard

+0

@Blorgbeard Хороший вопрос. Есть, но если я его отброшу, то миграция завершится неудачно. –

ответ

0

My connection string есть MultipleActiveResultSets=True комплект. Удаление этого из строки подключения решило проблему.

0

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

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

ИЛИ

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(){} 

Cheers!

+0

Ну, столбца не существует, поэтому я пытаюсь его добавить. Изменение переноса на ваш результат приводит к ошибке 'ALTER TABLE DROP COLUMN, потому что столбец« ColumnName »не существует в таблице« TableName ».« –

+0

Итак, если вы пытаетесь сделать это просто столбец, просто используйте «AddColumn» («NAME_OF_YOUR_TABLE» "," NAME_OF_YOUR_COLUMN ", c => c.Boolean (nullable: false)' и оставьте пустым –

+0

FYI, вам нужно заменить ColumnName для имени используемого столбца. –