在ASP.NET MVC 2中,使用實體框架4時,出現「IEntityChangeTracker的多個實例無法引用實體對象」的錯誤。每個HttpContext只使用一個ObjectContext的C#實體框架
SO的搜索表明它可能是因爲我有不同的實體框架ObjectContext的實例,它應該只是每個HttpContext的一個ObjectContext實例。
我有這樣的代碼(寫入很久之前我加入),似乎做到這一點 - 每個HttpContext有一個ObjectContext。但我經常收到「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;
}
我已經研究這個代碼,它看起來是正確的。它盡我所能地告訴爲每個HttpContext返回一個ObjectContext實例。代碼是否錯誤?
如果代碼沒有錯,爲什麼我會得到「一個實體對象不能被多個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();
}
}
你在EndRequest方法中處理上下文嗎? – Akhil
已更新爲顯示處置方法 –