在 ASP.NET MVC 2 中,使用 Entity Framework 4,我收到此错误“IEntityChangeTracker 的多个实例无法引用实体对象”。
搜索 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();
}
}