2011-06-14 2 views
4

Nous avons des problèmes de performance avec notre solution EF4 MVC. Nous avons été en mesure de le suivre jusqu'à ce qu'ArithAbort soit désactivé avant toutes les connexions à la base de données, et maintenant nous essayons de le forcer à rester sur 'ON'.contrôle ArithAbort dans EF4

Nous avons examiné: How do you control the "SET" statements emitted by Linq to SQL

Mais il semble que EF4 réinitialise la connexion avant chaque requête, de sorte que ne fonctionnera pas. Jusqu'à présent, nous avons essayé de "définir ArithAbort sur" avant une requête donnée, sans aucune chance. Nous avons également essayé d'aller loin et de faire une nouvelle connexion là où nous l'avons définie, mais toujours pas de chance. Donc, quelqu'un a une idée de comment nous pouvons l'obtenir pour le définir avant de faire des requêtes linq contre la base de données?

La modification des paramètres de base de données n'est pas une option.

Edit: Par suggestion Andiihs J'ai essayé la solution d'emballage et ajouté dans les lignes de code suivantes à la classe EFCachingCommand

protected override DbDataReader ExecuteDbDataReader(CommandBehavior behavior) 
    { 
     if (this.WrappedCommand.CommandType == System.Data.CommandType.Text) 
     { 
      this.WrappedCommand.CommandText = "set arithabort on; " + this.WrappedCommand.CommandText; 
     } 

Cela garantit essentiellement que les appels Linq-sql se préfixées avec le bon ensemble déclaration.

Je devais aussi ajouter:

DbFunctionCommandTree functionTree = commandTree as DbFunctionCommandTree; 
    if (functionTree != null) 
    { 
     this.IsModification = true; 
     return; 
    } 

à la fonction GetAffectedEntitySets dans le EFCachingCommandDefinition, afin de le faire fonctionner correctement avec des appels de procédure stockée.

+0

Merci d'avoir posté cette question. L'article lié sur MSDN est très long. Pourriez-vous s'il vous plaît poster une réponse complète à votre propre question, avec une explication étape par étape de la façon de résoudre le problème? Merci! –

+0

Je dois admettre que ça fait longtemps que j'ai travaillé avec ce problème. Je suis à peu près sûr que tout ce que j'ai fait était d'inclure les classes wrapper hors de la boîte qu'Andiih a lié d'abord dans sa réponse et ensuite les a modifiées comme décrit dans ma question modifiée. – Grubsnik

Répondre

4

EF offre la possibilité d'insérer un fournisseur d'emballage entre l'entité de connexion et SQL.Data.Client - voir http://code.msdn.microsoft.com/EFProviderWrappers et http://blogs.msdn.com/b/jkowalski/archive/2009/06/11/tracing-and-caching-in-entity-framework-available-on-msdn-code-gallery.aspx

Maintenant, je l'admets plus d'un indice d'une réponse - mais peut-être que vous pouvez insérer les ensemble pertinent à ce stade?

+0

On dirait que c'est un très bon endroit pour commencer. Je vais creuser et voir ce que je peux trouver. – Grubsnik

+0

Cela a fonctionné comme un charme. Merci pour l'indice. – Grubsnik

+1

pouvez-vous partager ce que vous avez trouvé s'il vous plaît? – Andiih