visual tutorial studio online framework español ejemplos consulta conexion c# sql-server linq-to-sql

c# - tutorial - ¿Qué puede causar una EntityCommandExecutionException en EntityCommandDefinition.ExecuteStoreCommands?



linq to sql visual studio 2017 (3)

Una consulta particular de LINQ-to-SQL que selecciona campos de una vista de SQL Server en un programa de C # que se ejecuta en una base de datos de SQL Server 2008, que funciona bien en mi entorno de desarrollo local, produce una excepción cuando se ejecuta en el entorno de prueba:

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

¿Qué está causando que ocurra esta excepción?


Esto puede deberse a que faltan "Conjuntos de resultados activos múltiples" en la cadena de conexión.

Los conjuntos de resultados activos múltiples (MARS) son una función que permite la ejecución de varios lotes en una sola conexión. En versiones anteriores, solo se podía ejecutar un lote a la vez contra una sola conexión. La ejecución de varios lotes con MARS no implica la ejecución simultánea de operaciones.

Arreglar:

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


Esto puede deberse a una consulta LINQ que intenta seleccionar un campo que no existe realmente en la tabla o vista de la base de datos de destino.

Una forma en que esto puede suceder (que fue el problema en mi caso) es descuidar la implementación en el entorno de destino de una migración de Entity Framework recientemente creada que agrega el nuevo campo a la vista que se consulta.

Otra cosa a tener en cuenta es la excepción interna de la EntityCommandExecutionException lanzada (como lo sugiere el mensaje de error). En este caso, la excepción interna era de tipo SqlException y tenía el mensaje útil Invalid column name ''[my column name]'' .

Por lo tanto, hay cosas que ver cuando se emite una EntityCommandExecutionException en EntityCommandDefinition.ExecuteStoreCommands cuando se ejecuta una consulta de LINQ-to-SQL:

  • Examine la excepción interna (como lo sugiere el mensaje de error de la excepción externa).
  • Asegúrese de que todas las migraciones de Entity Framework se hayan implementado en el entorno de destino (si EF está en uso).
  • Compruebe y vea si la consulta está intentando seleccionar un campo que no existe.

Me ayudó el acceso a la propiedad local como. La excepción :

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