实体框架MappingException:类型'XXX已被多次映射

时间:2010-06-17 11:44:10

标签: c# .net entity-framework

我在Web应用程序中使用Entity框架。每个请求创建ObjectContext(使用HttpContext),特此代码:

string ocKey = "ocm_" + HttpContext.Current.GetHashCode().ToString();
if (!HttpContext.Current.Items.Contains(ocKey))
{
    HttpContext.Current.Items.Add(ocKey, new ElevationEntityModel(EFConnectionString));
}
_eem = HttpContext.Current.Items[ocKey] as ElevationEntityModel;

不是每次都有,但有时我有这个例外:

  

System.Data.MappingException未被用户代码Message = The处理   类型'XXX'已被映射多次。源= System.Data.Entity的

我非常困惑,我不知道是什么原因导致了这个问题。

有人能帮助我吗?

2 个答案:

答案 0 :(得分:19)

它看起来像是同步问题。一个简单的解决方案是拥有一个共享的锁对象(在你的类中):

private static object _lock = new object();

然后您的代码变为:

string ocKey = "ocm_" + HttpContext.Current.GetHashCode().ToString(); 

lock (_lock) {
    if (!HttpContext.Current.Items.Contains(ocKey)) 
    { 
          HttpContext.Current.Items.Add(ocKey, new ElevationEntityModel(EFConnectionString)); 
    } 
    _eem = HttpContext.Current.Items[ocKey] as ElevationEntityModel; 

}

锁定块基本上意味着一旦线程进入“锁定”块,在第一个线程完成之前,没有其他线程可以访问该块。这将停止“Contains”方法和“Add”方法之间的争用。

注意: 如果您的应用程序中的任何其他位置正在访问HttpContext.Current中的Items集合,则还需要在那里进行同步。创建自定义集合,将其添加到Items集合并同步对此集合的访问是明智的。

答案 1 :(得分:10)

这是因为当您进行多线程并且您正在访问相同的ObjectContext而不先同步线程时...