Une requête LINQ-to-SQL particulière sélectionnant des champs dans une vue SQL Server d'un programme C # s'exécutant sur une base de données SQL Server 2008, qui fonctionne correctement dans mon environnement de développement local, génère une exception lors de son exécution dans l'environnement de transfert:
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-ce qui cause cette exception?
Cela peut être dû à une requête LINQ qui tente de sélectionner un champ qui n'existe pas dans la vue ou la table de la base de données cible.
Une des façons dont cela peut se produire (ce qui était le problème dans mon cas) est de ne pas déployer dans l'environnement cible une migration Entity Framework récemment créée qui ajoute le nouveau champ à la vue interrogée.
Une autre chose à examiner est l’exception interne de l’exception EntityCommandExecutionException renvoyée (comme suggéré par le message d’erreur). Dans ce cas, l'exception interne était de type SqlException et contenait le message utile Invalid column name ‘[my column name]’
.
Donc, les choses à regarder quand une EntityCommandExecutionException à EntityCommandDefinition.ExecuteStoreCommands sont levées lors de l'exécution d'une requête LINQ-to-SQL:
Cela peut être dû à "Plusieurs jeux de résultats actifs" manquant dans la chaîne de connexion.
Plusieurs ensembles de résultats actifs (MARS) sont une fonctionnalité qui permet l'exécution de plusieurs lots sur une seule connexion. Dans les versions précédentes, un seul lot pouvait être exécuté à la fois pour une seule connexion. L'exécution de plusieurs lots avec MARS n'implique pas l'exécution simultanée d'opérations.
Pour réparer:
string connectionString = "Data Source=MSSQL1;" +
"Initial Catalog=AdventureWorks;Integrated Security=SSPI;" +
"MultipleActiveResultSets=True";
Moi aidé à l'accès à la propriété locale comme. L'éxéption :
foreach (var myTableObject in context.Table)
{
// Exception
}
foreach (var myTableObject in context.Table.Local)
{
// No exception
}