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.