framework filetype aprender c# .net entity-framework

c# - filetype - Entity framework MappingException: el tipo ''XXX se ha mapeado más de una vez



entity framework 6+ (2)

Estoy usando Entity Framework en la aplicación web. ObjectContext se crea por solicitud (usando HttpContext), aquí 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 siempre, pero a veces tengo esta excepción:

System.Data.MappingException no fue manejado por el código de usuario Mensaje = El tipo ''XXX'' ha sido mapeado más de una vez. Fuente = System.Data.Entity

Estoy absolutamente confundido y no tengo idea de qué puede causar este problema.

Alguien puede ayudarme?


Esto se produce cuando tiene subprocesos múltiples en ejecución y está accediendo al mismo ObjectContext sin sincronizar primero los subprocesos


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

private static object _lock = new object();

Entonces su 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 bloque básicamente significa que una vez que un subproceso entra en el bloque de "bloqueo", ningún otro subproceso puede acceder a ese bloque hasta que finaliza el primer subproceso. Esto detendrá la disputa entre el método "Contiene" y el método "Agregar".

Nota: si en cualquier otra parte de su aplicación tiene acceso a la colección de elementos en HttpContext.Current, también deberá sincronizar allí. Es aconsejable crear una colección personalizada, agregar esto a la colección Artículos y sincronizar el acceso a esta.