Что может вызвать EntityCommandExecutionException в EntityCommandDefinition.ExecuteStoreCommands?
Конкретный запрос LINQ-to-SQL, выбирающий поля из представления SQL Server в программе на C#, работающей с базой данных 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 ...]
Что вызывает это исключение?
3 ответа
Это может быть вызвано запросом LINQ, который пытается выбрать поле, которого на самом деле не существует в целевом представлении базы данных или таблице.
Одним из способов, которым это может произойти (что и было проблемой в моем случае), является пренебрежение развертыванием в целевой среде недавно созданной миграции Entity Framework, которая добавляет новое поле к запрашиваемому представлению.
Еще одна вещь, на которую следует обратить внимание, - это внутреннее исключение, которое выдается в исключении EntityCommandExecutionException (как указано в сообщении об ошибке). В этом случае внутреннее исключение имело тип SqlException и содержало полезное сообщение Invalid column name ‘[my column name]’
,
Итак, на что обратить внимание, когда возникает исключение EntityCommandExecutionException в EntityCommandDefinition.ExecuteStoreCommands при выполнении запроса LINQ-to-SQL:
- Изучите внутреннее исключение (как указано в сообщении об ошибке внешнего исключения).
- Убедитесь, что все миграции Entity Framework были развернуты в целевой среде (если EF используется).
- Проверьте и посмотрите, пытается ли запрос выбрать несуществующее поле.
Это может быть вызвано отсутствием "нескольких активных наборов результатов" в строке подключения.
Несколько активных наборов результатов (MARS) - это функция, которая позволяет выполнять несколько пакетов на одном соединении. В предыдущих версиях одновременно мог выполняться только один пакет для одного соединения. Выполнение нескольких пакетов с помощью 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
}