Спасибо посмотрю что я могу там сделать
.NET MVC 2, используя Entity Framework 4, я получаю эту ошибку «На объектный объект нельзя ссылаться несколькими экземплярами IEntityChangeTracker».
Поиск SO показывает, что это возможно потому, что у меня есть разные экземпляры Entity Framework ObjectContext, когда это должен быть только один экземпляр ObjectContext для каждого HttpContext.
У меня есть этот код (написанный задолго до того, как я присоединился), который, кажется, делает именно это - имеет один ObjectContext для каждого HttpContext. Но я получаю исключение "IEntityChangeTracker" часто, поэтому оно, вероятно, не работает должным образом:
// 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;
}
Я проверил этот код, и он выглядит правильно. Насколько я могу сказать, он возвращает один экземпляр ObjectContext для каждого HttpContext. Код неправильный?
Если код не является неправильным, почему иначе я получу исключение «Объект сущности не может быть указан несколькими экземплярами IEntityChangeTracker»?
РЕДАКТИРОВАТЬ: Чтобы показать, как расположен 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();
}
}