ASP.NET MVC 2では、Entity Framework 4を使用して、「エンティティオブジェクトはIEntityChangeTrackerの複数のインスタンスで参照できません」というエラーが表示されます。HttpContextごとにObjectContextを1つだけ使用するEntity Framework
SOの検索では、Entity Framework ObjectContextのインスタンスがそれぞれ異なるため、おそらくHttpContextごとに1つのObjectContextインスタンスにする必要があると考えられます。
すべてのHttpContextに対して1つのObjectContextを持っています。
// 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;
}
を、私はこのコードを検討してきたし、それが正しいになります。それはおそらく意図したとおりに動作していないので、しかし、私は頻繁に「IEntityChangeTracker」の例外を取得しています。各HttpContextに対して1つのObjectContextインスタンスを返すことができます。コードが間違っていますか?
コードが間違っていない場合は、「エンティティオブジェクトは複数インスタンスのIEntityChangeTrackerで参照できません」という例外が表示されるのはなぜですか?
EDIT:
// 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
処分方法を表示するように更新されました –