Что может вызвать EntityCommandExecutionException в EntityCommandDefinition.ExecuteStoreCommands?

Конкретный запрос LINQ-to-SQL, выбирающий поля из представления SQL Server в программе на С#, работающей с базой данных SQL Server 2008, которая отлично работает в моей локальной среде разработки, выдает исключение при запуске в промежуточной среде:

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 ...] 

Что вызывает это исключение?

Ответ 1

Это может быть вызвано запросом LINQ, который пытается выбрать поле, которое на самом деле не существует в целевом представлении базы данных или таблице.

Одним из способов, которым это может произойти (что и было проблемой в моем случае), является пренебрежение развертыванием в целевой среде недавно созданной миграции Entity Framework, которая добавляет новое поле к запрашиваемому представлению.

Еще одна вещь, на которую следует обратить внимание, - это внутреннее исключение, которое выдается в исключении EntityCommandExecutionException (как указано в сообщении об ошибке). В этом случае внутреннее исключение имело тип SqlException и содержало полезное сообщение " Invalid column name '[my column name].

Итак, на что обратить внимание, когда возникает исключение EntityCommandExecutionException в EntityCommandDefinition.ExecuteStoreCommands при выполнении запроса LINQ-to-SQL:

  • Изучите внутреннее исключение (как показано в сообщении об ошибке внешнего исключения).
  • Убедитесь, что все миграции Entity Framework были развернуты в целевой среде (если EF используется).
  • Проверьте и посмотрите, пытается ли запрос выбрать несуществующее поле.

Ответ 2

Это может быть вызвано отсутствием "нескольких активных наборов результатов" в строке подключения.

Несколько активных наборов результатов (MARS) - это функция, которая позволяет выполнять несколько пакетов на одном соединении. В предыдущих версиях одновременно мог выполняться только один пакет для одного соединения. Выполнение нескольких пакетов с помощью MARS не подразумевает одновременного выполнения операций.

Фикс:

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

Ответ 3

Мне помог доступ к свойству Local. Исключение:

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


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