ローカルの開発環境で正常に実行される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 ...]
この例外が発生する原因は何ですか?
これは、ターゲットデータベースビューまたはテーブルに実際には存在しないフィールドを選択しようとしているLINQクエリが原因で発生する可能性があります。
これが発生する可能性のある1つの方法(私の場合は問題でした)は、クエリ対象のビューに新しいフィールドを追加する最近作成されたEntity Framework移行をターゲット環境に展開することを怠っています。
もう1つ注目すべきは、スローされたEntityCommandExecutionExceptionの内部例外です(エラーメッセージで示唆されています)。この場合、内部例外はSqlException型であり、有用なメッセージInvalid column name ‘[my column name]’
。
そのため、LINQ-to-SQLクエリの実行中にEntityCommandDefinition.ExecuteStoreCommandsでEntityCommandExecutionExceptionがスローされたときに確認するもの:
これは、 "複数のアクティブな結果セット" 接続文字列にないことが原因である可能性があります。
複数のアクティブな結果セット(MARS)は、単一の接続で複数のバッチを実行できる機能です。以前のバージョンでは、1つの接続に対して一度に実行できるバッチは1つだけでした。 MARSで複数のバッチを実行しても、操作が同時に実行されるわけではありません。
修正するには:
string connectionString = "Data Source=MSSQL1;" +
"Initial Catalog=AdventureWorks;Integrated Security=SSPI;" +
"MultipleActiveResultSets=True";
私はのようなローカルプロパティへのアクセスを助けました。例外 :
foreach (var myTableObject in context.Table)
{
// Exception
}
foreach (var myTableObject in context.Table.Local)
{
// No exception
}