Erreurs occasionnelles "Le fournisseur sous-jacent a échoué lors de l'ouverture" lors de l'utilisation d'EF4 (modèle edmx)

J'espère que quelqu'un peut m'aider avec une solution à l'erreur. L'application dans laquelle l'erreur se produit est en production et je n'ai jamais l'expérience de l'erreur moi-même. Mais autour de 20 fois par jour je reçois un message d'erreur me disant:

Le fournisseur sous-jacent échoué sur Ouvrir. --->
Système.InvalidOperationException: La connexion n'a pas été fermé. L'
connexion de l'état actuel de la connexion.

Voici la trace de la pile

Système.Les données.EntityException: Le fournisseur sous-jacent échoué sur Ouvrir.
---> Système.InvalidOperationException: La connexion n'a pas été fermé. La connexion de l'état actuel de la connexion. au
Système.Les données.ProviderBase.DbConnectionBusy.OpenConnection(DbConnection
outerConnection, DbConnectionFactory connectionFactory) à
Système.Les données.SqlClient.SqlConnection.Open() à
HibernatingRhinos.Profiler.Appender.ProfiledDataAccess.ProfiledConnection.Open()
au
Système.Les données.EntityClient.EntityConnection.OpenStoreConnectionIf(Boolean
openCondition, DbConnection storeConnectionToOpen, DbConnection
originalConnection, Chaîne exceptionCode, Chaîne attemptedOperation,
Boolean& closeStoreConnectionOnFailure) --- Fin de l'exception interne
trace de la pile --- à
Système.Les données.EntityClient.EntityConnection.OpenStoreConnectionIf(Boolean
openCondition, DbConnection storeConnectionToOpen, DbConnection
originalConnection, Chaîne exceptionCode, Chaîne attemptedOperation,
Boolean& closeStoreConnectionOnFailure) à
Système.Les données.EntityClient.EntityConnection.Open() à
Système.Les données.Objets.ObjectContext.EnsureConnection() à
Système.Les données.Objets.ObjectQuery1.GetResults(Nullable1
forMergeOption) à
Système.Les données.Objets.ObjectQuery1.System.Collections.Generic.IEnumerable<T>.GetEnumerator()
at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable
1
source)
Système.Les données.Objets.ELinq.ObjectQueryProvider.b__1[TResult](IEnumerable1
sequence) at
System.Data.Objects.ELinq.ObjectQueryProvider.ExecuteSingle[TResult](IEnumerable
1
requête, l'Expression queryRoot) à
Système.Les données.Objets.ELinq.ObjectQueryProvider.Système.Linq.IQueryProvider.Exécutez[S](Expression
expression) à
Système.Linq.Interrogeable.FirstOrDefault[TSource](IQueryable`1 source)
au
GuideSites.DomainModel.Les référentiels.ClinicTermRepository.GetClinicTermByGuideSiteId(Int32
guideSiteId)
C:\Projets\GuideSites\GuideSites.DomainModel\Référentiels\ClinicTermRepository.cs:ligne
20 à
GuideSites.Web.Frontend.Les aides.VerifyUrlHelper.RedirectOldUrls() dans
C:\Projets\GuideSites\GuideSites.Web.Frontend\Aides\VerifyUrlHelper.cs:ligne
91 à
GuideSites.Web.Frontend.MvcApplication.Application_BeginRequest(Objet
sender, EventArgs e) dans
C:\Projets\GuideSites\GuideSites.Web.Frontend\Global.asax.cs:la ligne 412
au
Système.Web.HttpApplication.SyncEventExecutionStep.Système.Web.HttpApplication.IExecutionStep.Execute()
au Système.Web.HttpApplication.ExecuteStep(IExecutionStep étape,
Boolean& completedSynchronously)

- Je utiliser EF4 par le biais d'un modèle EDMX et je la voie je me connecter à la base de données (MS SQL 2008) est par l'intermédiaire d'un HttpContext-par-requête du contexte de l'objet, de sorte que les connexions à la base de données ne sont pas ouvertes et fermées pour chaque morceau de données dont j'ai besoin sur un pageload.

Mon contexte de Base de données de la classe ressemble à ceci:

public class DatabaseContext : IDisposable
{
    private const string ContextName = "context";
    private static dbEntities _dbEntities;

    public dbEntities GetDatabaseContext()
    {
        SqlConnection.ClearAllPools();

        if (HttpContext.Current == null)
            return _dbEntities ?? (_dbEntities = new dbEntities());

        if (HttpContext.Current.Items[ContextName] == null)
            HttpContext.Current.Items[ContextName] = new dbEntities();

        _dbEntities = (dbEntities)HttpContext.Current.Items[ContextName];
        if (_dbEntities.Connection.State == ConnectionState.Closed)
        {
            _dbEntities.Connection.Open();
            return _dbEntities;
        }

        return _dbEntities;
    }


    public void RemoveContext()
    {
        if (HttpContext.Current != null && HttpContext.Current.Items[ContextName] != null)
        {
            ((dbEntities)HttpContext.Current.Items[ContextName]).Dispose();
            HttpContext.Current.Items[ContextName] = null;
        }

        if (_dbEntities != null)
        {
            _dbEntities.Dispose();
            _dbEntities = null;
        }
    }


    public void Dispose()
    {
        RemoveContext();
    }

}

Dans mes dépots j'utilise le contexte de base de données comme ceci:

public class SomeRepository
{
    private static readonly object Lock = new object();
    private readonly dbEntities _dbEntities;

    public SomeRepository()
    {
        var databaseContext = new DatabaseContext();
        _dbEntities = databaseContext.GetDatabaseContext();
    }


    public IEnumerable<SomeRecord> GetSomeData(int id)
    {
        lock (Lock)
        {
            return
                _dbEntities.SomeData.Where(c => c.Id == id);
        }
    }
 }

Le verrou(Lock) la chose était quelque chose que j'ai lu sur devrait aider à ce problème, mais dans mon cas, il n'a pas. Et en général, il est difficile de trouver des threads qui décrivent exactement mon problème et encore moins une solution au problème.

L'application est un ASP.NET MVC3 application et d'installation comme une application en cours d'exécution, pour les 9 sites différents (le domaine détermine le contenu pour être servi pour le client). Le 9 sites web n'ont pas plus de 2.000 le nombre de pages vues par jour, alors la base de données doit être souligné à ce compte.

J'espère que quelqu'un peut l'aider et s'il vous plaît laissez-moi savoir si il ya quelque chose que j'ai oublié de mentionner.

source d'informationauteur hylle