20 votos

Entity framework MappingException: El tipo 'XXX ha sido asignada más de una vez

Estoy usando Entity framework de aplicaciones web. ObjectContext es creado por solicitud (mediante HttpContext), por el presente código:

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;

No todo el tiempo, pero a veces tengo esta excepción:

Sistema.De datos.MappingException fue controlada por el código de usuario Message=La tipo de 'XXX' ha sido asignada más de una vez. Fuente=Sistema.De datos.Entidad

Estoy totalmente confundido y no tengo ninguna idea de lo que pueden causar este problema.

¿Alguien puede ayudarme?

12voto

David_001 Puntos 2825

Parece un problema de sincronización. Una solución sencilla sería tener un bloqueo compartido objeto (dentro de su clase):

private static object _lock = new object();

A continuación, el código se convierte en:

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; 

}

El bloqueo de cierre, básicamente, significa que una vez que un hilo entra en el "bloqueo" del bloque, no hay otros hilos pueden acceder a ese bloque hasta que el primer hilo de acabados. Esto detendrá la contienda entre el "Contiene" método y el método "Add".

Nota: Si en cualquier otro lugar en que la aplicación es el acceso a la colección de Elementos en HttpContext.Actual, tendrá que sincronizar. Es aconsejable crear una colección personalizada, agregar esto a la colección de Elementos, y sincronizar el acceso a esta.

7voto

Calanus Puntos 6164

Esto es causado cuando usted tiene multi-threading pasando y se accede a la misma ObjectContext sin la sincronización de los hilos de primera...

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X