2010-06-17 3 views
26

J'utilise Entity framework dans une application Web. ObjectContext est créé par demande (en utilisant HttpContext), le code par le présent:Entity framework MappingException: Le type 'XXX a été mappé plusieurs fois

string ocKey = "ocm_" + HttpContext.Current.GetHashCode().ToString(); 
if (!HttpContext.Current.Items.Contains(ocKey)) 
{ 
    HttpContext.Current.Items.Add(ocKey, new ElevationEntityModel(EFConnectionString)); 
} 
_eem = HttpContext.Current.Items[ocKey] as ElevationEntityModel; 

pas à chaque fois, mais parfois je cette exception:

System.Data.MappingException était non gérée par le code utilisateur Message = Le Le type 'XXX' a été mappé plusieurs fois. Source = System.Data.Entity

Je suis absolument confus et je n'ai aucune idée de ce qui peut causer ce problème.

Quelqu'un peut-il m'aider?

Répondre

19

Il ressemble à un problème de synchronisation. Une solution simple serait d'avoir un objet verrou partagé (dans votre classe):

private static object _lock = new object(); 

Ensuite, votre code devient:

string ocKey = "ocm_" + HttpContext.Current.GetHashCode().ToString(); 

lock (_lock) { 
    if (!HttpContext.Current.Items.Contains(ocKey)) 
    { 
      HttpContext.Current.Items.Add(ocKey, new ElevationEntityModel(EFConnectionString)); 
    } 
    _eem = HttpContext.Current.Items[ocKey] as ElevationEntityModel; 

} 

Le bloc de verrouillage signifie essentiellement qu'une fois un fil entre le « verrouillage » bloc, aucun autre thread ne peut accéder à ce bloc tant que le premier thread n'a pas terminé. Cela arrêtera la contention entre la méthode "Contient" et la méthode "Ajouter".

Note: Si nulle part ailleurs dans votre application accède à la collection Items dans HttpContext.Current, vous devrez synchroniser là-bas aussi. Il est judicieux de créer une collection personnalisée, de l'ajouter à la collection Items et de synchroniser l'accès à cette collection.

+0

Nous vous remercions! Maintenant c'est bien. – Michal

+0

Je corrige un vieux projet Silverlight mal écrit. C'est l'un des problèmes occasionnels avec RIA Services. Pour l'instant je mets des verrous essayant de l'empêcher. – Vad

10

Cela se produit lorsque vous avez le multi-threading passe et vous accédez à la même ObjectContext sans synchroniser les fils premier ...

Questions connexes