En ASP.NET MVC 2, utilizando Entity Framework 4, estoy recibiendo este error "Un objeto entidad no puede ser referenciado por varias instancias de IEntityChangeTracker".C# Entity Framework utilizando sólo un ObjectContext por HttpContext
Una búsqueda de SO muestra que probablemente se deba a que tengo instancias diferentes de Entity Framework ObjectContext, cuando debería ser solo una instancia de ObjectContext para cada HttpContext.
tengo este código (escrito mucho antes de que me uní) que aparece para hacer precisamente eso - ObjectContext tener uno para cada HttpContext. Pero me estoy haciendo la excepción "IEntityChangeTracker" con frecuencia por lo que es probable que no funcione como estaba previsto:
// in ObjectContextManager.cs
public const string ConnectionString = "name=MyAppEntities";
public const string ContainerName = "MyAppEntities";
public static ObjectContext GetObjectContext()
{
ObjectContext objectContext = GetCurrentObjectContext();
if (objectContext == null) // create and store the object context
{
objectContext = new ObjectContext(ConnectionString, ContainerName);
objectContext.ContextOptions.LazyLoadingEnabled = true;
StoreCurrentObjectContext(objectContext);
}
return objectContext;
}
private static void StoreCurrentObjectContext(ObjectContext objectContext)
{
if (HttpContext.Current.Items.Contains("EF.ObjectContext"))
HttpContext.Current.Items["EF.ObjectContext"] = objectContext;
else
HttpContext.Current.Items.Add("EF.ObjectContext", objectContext);
}
private static ObjectContext GetCurrentObjectContext()
{
ObjectContext objectContext = null;
if (HttpContext.Current.Items.Contains("EF.ObjectContext")
objectContext = (ObjectContext)HttpContext.Current.Items["EF.ObjectContext"];
return objectContext;
}
He examinado este código y parece correcta. Por lo que puedo decir devuelve una instancia de ObjectContext para cada HttpContext. Es el código mal?
Si el código no está mal, ¿por qué si no iba a obtener el "Un objeto entidad no puede ser referenciado por varias instancias de IEntityChangeTracker" excepción?
EDIT: Para mostrar cómo se dispone el ObjectContext:
// in HttpRequestModule.cs
private void Application_EndRequest(object source, EventArgs e)
{
ServiceLocator.Current.GetInstance<IRepositoryContext>().Terminate();
}
// in RepositoryContext.cs
public void Terminate()
{
ObjectContextManager.RemoveCurrentObjectContext();
}
// in ObjectContextManager.cs
public static void RemoveCurrentObjectContext()
{
ObjectContext objectContext = GetCurrentObjectContext();
if (objectContext != null)
{
HttpContext.Current.Items.Remove("EF.ObjectContext");
objectContext.Dispose();
}
}
están disponiendo que el contexto en el método EndRequest? – Akhil
actualiza para mostrar método de eliminación –