web-dev-qa-db-ja.com

EntityCommandDefinition.ExecuteStoreCommandsでEntityCommandExecutionExceptionが発生する原因は何ですか?

ローカルの開発環境で正常に実行されるSQL Server 2008データベースに対して実行されるC#プログラムのSQL Serverビューからフィールドを選択する特定のLINQ-to-SQLクエリは、ステージング環境で実行すると例外を生成します。

Exception Message: An error occurred while executing the command definition. See the inner exception for details. 

Exception Trace: System.Data.Entity.Core.EntityCommandExecutionException 
at System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior) 
at System.Data.Entity.Core.Objects.Internal.ObjectQueryExecutionPlan.Execute[TResultType](ObjectContext context, ObjectParameterCollection parameterValues) 
at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess) 
at System.Data.Entity.Core.Objects.ObjectQuery`1.<>c__DisplayClass7.b__5() 
at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func`1 operation) 
at System.Data.Entity.Core.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption) 
at System.Data.Entity.Core.Objects.ObjectQuery`1..GetEnumerator>b__0() 
at System.Data.Entity.Internal.LazyEnumerator`1.MoveNext() 
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) 
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) 
at [my code ...] 

この例外が発生する原因は何ですか?

21
Jon Schneider

これは、ターゲットデータベースビューまたはテーブルに実際には存在しないフィールドを選択しようとしているLINQクエリが原因で発生する可能性があります。

これが発生する可能性のある1つの方法(私の場合は問題でした)は、クエリ対象のビューに新しいフィールドを追加する最近作成されたEntity Framework移行をターゲット環境に展開することを怠っています。

もう1つ注目すべきは、スローされたEntityCommandExecutionExceptionの内部例外です(エラーメッセージで示唆されています)。この場合、内部例外はSqlException型であり、有用なメッセージInvalid column name ‘[my column name]’

そのため、LINQ-to-SQLクエリの実行中にEntityCommandDefinition.ExecuteStoreCommandsでEntityCommandExecutionExceptionがスローされたときに確認するもの:

  • 内側の例外を調べます(外側の例外のエラーメッセージが示唆するとおり)。
  • すべてのEntity Frameworkの移行がターゲット環境に展開されていることを確認します(EFが使用されている場合)。
  • クエリが存在しないフィールドを選択しようとしているかどうかを確認します。
24
Jon Schneider

これは、 "複数のアクティブな結果セット" 接続文字列にないことが原因である可能性があります。

複数のアクティブな結果セット(MARS)は、単一の接続で複数のバッチを実行できる機能です。以前のバージョンでは、1つの接続に対して一度に実行できるバッチは1つだけでした。 MARSで複数のバッチを実行しても、操作が同時に実行されるわけではありません。

修正するには:

string connectionString = "Data Source=MSSQL1;" + 
"Initial Catalog=AdventureWorks;Integrated Security=SSPI;" +
"MultipleActiveResultSets=True";
12

私はのようなローカルプロパティへのアクセスを助けました。例外 :

foreach (var myTableObject in context.Table)
{
    // Exception
}


foreach (var myTableObject in context.Table.Local)
{
    // No exception
}
0
Suplanus