2016-12-06 2 views
1

Entity Frameworkを使用していて、Visual Studioのパッケージマネージャコンソールからデータベース移行を実行しようとしています。私がすると、私は次のエラーとスタックトレースを取得します。Entity FrameworkでUpdate-Databaseを使用すると、サブクエリが2つ以上の値を返しました。

PM> Update-Database -Verbose StartUpプロジェクト 'Project'を使用します。 NuGetプロジェクトの 'DataModels'を使用します。 '-Verbose'フラグを指定すると、 SQL文がターゲット・データベースに適用されます。ターゲットデータベース は、 'データベース'(データソース:サーバー、プロバイダー:System.Data.SqlClient、 )のいずれかです。明示的な移行の適用: [201612061704158移行名]。明示的な移行の適用: 201612061704158移行名[NULL] DEFAULT 0 System.Data.SqlClient.SqlException(0x80131904):サブクエリが を1つ以上の値で返しました。サブクエリが、=、 !=、<、< =、>、> =、またはサブクエリが式として使用されている場合は、これは許可されません。 ステートメントが終了しました。 でSystem.Data.SqlClient.SqlConnection.OnError システムで System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj、ブールcallerHasConnectionLock、ブールasyncClose)で(SQLException例外、 ブールbreakConnection、アクション1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action 1 wrapCloseInAction)。 Data.SqlClient.TdsParser.TryRun(runBehavior runBehavior、 SqlCommandオブジェクトcmdHandler、SqlDataReaderのデータストリーム、 BulkCopySimpleResultSet bulkCopyHandler、TdsParserStateObject stateObj、ブール& DATAREADY) System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTdsで(文字列 methodNameの、ブール非同期、のInt32タイムアウト、ブールasyncWrite) System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery 1.Dispatch[TTarget,TInterceptionContext,TResult](TTarget target, Func System.Data.Entity.Infrastructure.Interception.InternalDispatcher 3動作時(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 C)、TInterceptionContext interceptionContext、 System.Data.Entityで実行 アクション3 executing, Action 3)。 System.Data.Entity.Migrations.DbMigrator.ExecuteSql(migrationStatement migrationStatementでSystem.Data.Entity.Internal.InterceptableDbCommand.ExecuteNonQuery()
でInfrastructure.Interception.DbCommandDispatcher.NonQuery(たDbCommand コマンド、DbCommandInterceptionContext interceptionContext) DbConnection接続、DbTransaction トランザクション、DbInterceptionContext interceptionContext) System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(AT System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ExecuteSql(MigrationStatement migrationStatement、たDbConnection接続、DbTransaction トランザクション、DbInterceptionContext interceptionContext)でIEnumerableを migrationStatements、でDbTransactionトランザクション、 System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsWithinNewTransactionでDbInterceptionContext interceptionContext)(IEnumerableを migrationStatements、たDbConnection接続、DbInterceptionContext interceptionContext)にSystem.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable 操作)System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy。、 System.Data.Entity.Migrations.Infrastructure.MigratorBase.ExecuteStatements(IEnumerableを1 migrationStatements) at System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, VersionedModel targetModel, IEnumerable 1操作で(IEnumerableを migrationStatements) System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsに(アクション 操作)を実行 IEnumerableを pendingMigrations、文字targetMigrationId、列lastMigrationId)System.Data.Entity.Migrationsで System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable`1 pendingMigrations、文字targetMigrationId、列lastMigrationId)

.DbMigrator.UpdateInternal(Stri ng targetMigration)at System.Data.Entity.Migrations.DbMigrator。 <> c__DisplayClassc.b__b() システムで System.Data.Entity.Migrations.Infrastructure.MigratorBase.EnsureDatabaseExists(アクション mustSucceedToKeepDatabase)で でSystem.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists(アクション mustSucceedToKeepDatabase)。 System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunnerでSystem.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(文字列 targetMigration)でData.Entity.Migrations.DbMigrator.Update(文字列 targetMigration)。 System.AppDomain.DoCallBackで を実行する(CrossAppDomainDelegate callBackDelegate) にSys tem.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate) System.Data.Entity.Migrations.Design.ToolingFacade.Update(文字列 targetMigrationでSystem.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner ランナー)で
、 Boolean force)を に設定します。System.Data.Entity.Migrations.UpdateDatabaseCommand。 <> c__DisplayClass2。 System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(アクション コマンド)で< .ctor> b__0() がClientConnectionId:40e2fc22-5bbd-4d83-88f3-ce5b2bc378dcエラー 番号:512、状態:1、クラス:16サブクエリは1つ以上の値を返しました。サブクエリが式として使用されている場合、サブクエリが=、!=、<、< =、>、> =または の場合、この は許可されません。ステートメントは 終了しました。

ここで何が起こっているのかわかりません。 SQL文を実行して、直接これは私がその後、移行ファイルに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"); 
    } 
} 

のように見えるものである微

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

の作品、私は正常に(空を実行することができます)移行。

また、このデータベースを含むすべての移行を空のデータベースに対して実行すると、すべて正常に動作します。そのため、エラーの原因となっているデータには問題があります(これは、エラーメッセージが表示された場合に予想されます)。

SQL Server Profilerを調べて、実行されているSQLを調べようとしましたが、何も表示されませんでした。

私はこの時点までうまくいった約20の他の移行を行っていますが、この1つと以前のものは一貫してこのエラーを投げかけています。

根本的な問題が何であるか、また何がうまくいかないのかについて誰が知ることができますか?

+0

'[TableName]'にトリガがありますか? – Blorgbeard

+0

@Blorgbeard良い質問です。ありますが、私がそれをドロップすると、同じ方法で移行が失敗します。 –

答えて

0

私の接続文字列はMultipleActiveResultSets=Trueに設定されていました。接続文字列からその文字列を削除すると、この問題が解決されました。

0

あなた自身で移行を書き込もうとしましたか?私はこの

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

乾杯!

+0

その列は存在しません。なぜそれを追加しようとしているのですか? 'TableName 'テーブルに' ColumnName 'カラムが存在しないため、' ALTER TABLE DROP COLUMNが失敗しました。' –

+0

あなたがやろうとしているのはちょうど列なので、 'AddColumn(" NAME_OF_YOUR_TABLE "、" NAME_OF_YOUR_COLUMN "、c => c.Boolean(nullable:false)'、空のままにする –

+0

ご参考までに、使用している列の名前をColumnNameに置き換えてください –

関連する問題