J'obtiens des délais d'expiration en utilisant Entity Framework (EF) lorsque j'utilise une fonction d'importation qui prend plus de 30 secondes pour se terminer. J'ai essayé ce qui suit et je n'ai pas pu résoudre ce problème:
J'ai ajouté Default Command Timeout=300000
à la chaîne de connexion dans le fichier App.Config dans le projet qui a le fichier EDMX comme suggéré ici .
Voici à quoi ressemble ma chaîne de connexion:
<add
name="MyEntityConnectionString"
connectionString="metadata=res://*/MyEntities.csdl|res://*/MyEntities.ssdl|
res://*/MyEntities.msl;
provider=System.Data.SqlClient;provider connection string="
Data Source=trekdevbox;Initial Catalog=StarTrekDatabase;
Persist Security Info=True;User ID=JamesTKirk;Password=IsFriendsWithSpock;
MultipleActiveResultSets=True;Default Command Timeout=300000;""
providerName="System.Data.EntityClient" />
J'ai essayé de définir le CommandTimeout dans mon référentiel directement comme ceci:
private TrekEntities context = new TrekEntities();
public IEnumerable<TrekMatches> GetKirksFriends()
{
this.context.CommandTimeout = 180;
return this.context.GetKirksFriends();
}
Que puis-je faire d'autre pour empêcher l'EF de se terminer? Cela ne se produit que pour les très grands ensembles de données. Tout fonctionne bien avec de petits ensembles de données.
Voici l'une des erreurs que je reçois:
System.Data.EntityCommandExecutionException: une erreur s'est produite lors de l'exécution de la définition de commande. Voir l'exception interne pour plus de détails. ---> System.Data.SqlClient.SqlException: le délai a expiré. Le délai d'expiration s'est écoulé avant la fin de l'opération ou le serveur ne répond pas.
OK - je l'ai fait fonctionner et c'est idiot ce qui s'est passé. J'avais à la fois la chaîne de connexion avec Default Command Timeout=300000
et le CommandTimeout défini sur 180. Lorsque j'ai supprimé le Default Command Timeout
de la chaîne de connexion, cela a fonctionné. La réponse est donc de définir manuellement le CommandTimeout dans votre référentiel sur votre objet de contexte comme suit:
this.context.CommandTimeout = 180;
Apparemment, la définition des paramètres de délai d'attente dans la chaîne de connexion n'a aucun effet.
"
dans la chaîne.NONCLUSTERED
index à certaines tables, cela a résolu le problème de délai d'attente pour nous.Réponses:
Il existe un bogue connu avec la spécification du délai d'expiration de la commande par défaut dans la chaîne de connexion EF.
http://bugs.mysql.com/bug.php?id=56806
Supprimez la valeur de la chaîne de connexion et définissez-la sur l'objet de contexte de données lui-même. Cela fonctionnera si vous supprimez la valeur en conflit de la chaîne de connexion.
Entity Framework Core 1.0:
Entity Framework 6:
Entity Framework 5:
Entity Framework 4 et inférieur:
la source
this.Database.SetCommandTimeout(180);
Si vous utilisez un DbContext, utilisez le constructeur suivant pour définir le délai d'expiration de la commande:
la source
DbContext
classe dérivée a été générée automatiquement à partir d'unedmx
fichier?Si vous utilisez
DbContext
et EF v6 +, vous pouvez également utiliser:la source
Habituellement, je gère mes opérations au sein d'une transaction . Comme je l'ai expérimenté, il ne suffit pas de définir le délai d'expiration de la commande de contexte, mais la transaction a besoin d'un constructeur avec un paramètre de délai d'expiration. J'ai dû définir les deux valeurs de délai d'expiration pour que cela fonctionne correctement.
À la fin de la fonction, j'ai remis le délai d'expiration de la commande à la valeur précédente dans prevto.
Utilisation d'EF6
la source
Je sais que ce thread est très ancien, mais EF n'a toujours pas corrigé cela. Pour les personnes utilisant la génération automatique, vous
DbContext
pouvez utiliser le code suivant pour définir le délai d'expiration manuellement.la source
Si vous utilisez Entity Framework comme moi, vous devez définir le délai d'expiration au démarrage comme suit:
la source
C'est ce que j'ai financé. Peut-être que cela aidera quelqu'un:
Alors c'est parti:
Si vous utilisez LINQ avec EF à la recherche de certains éléments exacts contenus dans la liste comme ceci:
tout va bien jusqu'à ce que IdList contienne plus d'un ID.
Le problème de «timeout» apparaît si la liste contient un seul ID. Pour résoudre le problème, utilisez la condition if pour vérifier le nombre d'identifiants dans IdList.
Exemple:
Explication:
Essayez simplement d'utiliser Sql Profiler et vérifiez l'instruction Select générée par Entity frameeork. …
la source