Entity Framework Délais D'Attente

j'obtiens des temps morts en utilisant L'Entity Framework (EF) lorsque j'utilise une fonction d'importation qui prend plus de 30 secondes à compléter. J'ai essayé le suivant et n'ont pas été en mesure de résoudre ce problème:

j'ai ajouté Default Command Timeout=300000 à la chaîne de connexion dans le App.Config fichier 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=&quot;
       Data Source=trekdevbox;Initial Catalog=StarTrekDatabase;
       Persist Security Info=True;User ID=JamesTKirk;Password=IsFriendsWithSpock;
       MultipleActiveResultSets=True;Default Command Timeout=300000;&quot;"
    providerName="System.Data.EntityClient" />

j'ai essayé de configurer la CommandTimeout dans mon dépôt 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 obtenir le Fe de la synchronisation? Cela ne se produit que pour les très grands ensembles de données. Tout fonctionne très bien avec de petits ensembles de données.

Voici une des erreurs que j'obtiens:

Système

.Données.EntityCommandExecutionException: une erreur s'est produite pendant l'exécution de la commande définition. Voir l'exception interne pour plus de détails. ---> Système.Données.SqlClient.SqlException: Timeout expiré. Le délai écoulé avant la fin de l'opération ou le serveur ne répond pas.


OK - j'ai obtenu ce travail et c'est idiot ce qui s'est passé. J'ai eu à la fois la chaîne de connexion avec Default Command Timeout=300000 et le CommandTimeout réglé à 180. Quand j'ai enlevé le Default Command Timeout de la chaîne de connexion, ça a marché. De sorte que le la réponse est de définir manuellement le paramètre CommandTimeout dans votre dépôt sur votre objet contextuel comme suit:

this.context.CommandTimeout = 180;

apparemment, le fait de définir les paramètres de temporisation dans la chaîne de connexion n'a aucun effet sur elle.

267
demandé sur Community 2011-06-04 00:58:51

7 réponses

il y a un bug connu avec la spécification de la commande par défaut timeout 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 conflictuelle de la chaîne de connexion.

Entity Framework Core 1.0:

this.context.Database.SetCommandTimeout(180);

Entity Framework 6:

this.context.Database.CommandTimeout = 180;

Entity Framework 5:

((IObjectContextAdapter)this.context).ObjectContext.CommandTimeout = 180;

Entity Framework 4 et au-dessous:

this.context.CommandTimeout = 180;
476
répondu Chev 2017-05-23 08:53:08

si vous utilisez un DbContext, utilisez le constructeur suivant pour définir la commande timeout:

public class MyContext : DbContext
{
    public MyContext ()
    {
        var adapter = (IObjectContextAdapter)this;
        var objectContext = adapter.ObjectContext;
        objectContext.CommandTimeout = 1 * 60; // value in seconds
    }
}
93
répondu saille 2012-10-17 21:52:49

si vous utilisez DbContext et EF v6+, vous pouvez aussi utiliser:

this.context.Database.CommandTimeout = 180;
33
répondu Paul 2013-11-05 19:17:24

Habituellement, je traite mes opérations dans le cadre d'une transaction . Comme je l'ai expérimenté, il ne suffit pas de définir la commande de contexte timeout, mais la transaction a besoin d'un constructeur avec un paramètre timeout. J'ai dû mettre deux valeurs de temporisation pour qu'il fonctionne correctement.

int? prevto = uow.Context.Database.CommandTimeout;
uow.Context.Database.CommandTimeout = 900;
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, TimeSpan.FromSeconds(900))) {
...
}

à la fin de la fonction, j'ai ramené la commande timeout à la valeur précédente dans prevto.

utilisant EF6

8
répondu pillesoft 2016-02-10 09:24:26

je sais que c'est un très vieux fil courant, mais EF n'a toujours pas corrigé cela. Pour les personnes qui utilisent DbContext généré automatiquement peut utiliser le code suivant pour régler le délai manuellement.

public partial class SampleContext : DbContext
{
    public SampleContext()
        : base("name=SampleContext")
    {
        this.SetCommandTimeOut(180);
    }

    public void SetCommandTimeOut(int Timeout)
    {
        var objectContext = (this as IObjectContextAdapter).ObjectContext;
        objectContext.CommandTimeout = Timeout;
    }
3
répondu Shiva N 2017-11-13 16:15:34

C'est ce que j'ai financé. Peut-être cela aidera quelqu'un:

allons-y Alors:

si vous utilisez LINQ avec EF à la recherche de certains éléments exacts contenus dans la liste comme ceci:

await context.MyObject1.Include("MyObject2").Where(t => IdList.Contains(t.MyObjectId)).ToListAsync();

tout va bien jusqu'à ce que IdList contienne plus d'Une Id.

le problème "timeout" apparaît si la liste ne contient qu'un seul Id. Pour résoudre le problème utilisez Si condition pour vérifier le nombre d'ID dans IdList.

exemple:

if (IdList.Count == 1)
{
    result = await entities. MyObject1.Include("MyObject2").Where(t => IdList.FirstOrDefault()==t. MyObjectId).ToListAsync();
}
else
{
    result = await entities. MyObject1.Include("MyObject2").Where(t => IdList.Contains(t. MyObjectId)).ToListAsync();
}

explication:

essayez simplement D'utiliser Sql Profiler et vérifiez L'instruction Select générée par Entity frameeork. ...

1
répondu tosjam 2017-01-31 12:00:32

si vous utilisez Entity Framework comme moi, vous devez définir Time out on Startup class comme suit:

 services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"), o => o.CommandTimeout(180)));
0
répondu parismiguel 2018-08-01 17:52:40