Спасибо посмотрю что я могу там сделать

.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();
    }
}

Ответы на вопрос(1)

Ваш ответ на вопрос