C# EF5/Base存储库的并发问题

C# EF5/Base存储库的并发问题,c#,entity-framework,C#,Entity Framework,我已经完成了一个新应用程序的编写,该应用程序现在已经部署到了实时环境中,但是我的全局错误处理程序在一天中多次接收到这些异常。这些错误分批出现,并且是四个粗体错误之一 MVC4、IIS6、WindowsServer2003、.Net.4.0、EF5(最新版本来自NuGet) 类型“ARandomModelInMyContext”已映射多次。 System.Data.Entity.Internal.LazyInternalContext.InitializeContext() at System.D

我已经完成了一个新应用程序的编写,该应用程序现在已经部署到了实时环境中,但是我的全局错误处理程序在一天中多次接收到这些异常。这些错误分批出现,并且是四个粗体错误之一

MVC4、IIS6、WindowsServer2003、.Net.4.0、EF5(最新版本来自NuGet)

类型“ARandomModelInMyContext”已映射多次。

System.Data.Entity.Internal.LazyInternalContext.InitializeContext() at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType) at System.Data.Entity.Internal.Linq.InternalSet`1.Initialize()
索引超出范围。必须为非负数且小于集合的大小。

Parameter name: index
System.ThrowHelper.ThrowArgumentOutOfRangeException() at System.Data.Metadata.Edm.MetadataCollection`1.get_Item(Int32 index) at System.Data.Mapping.DefaultObjectMappingItemCollection.ContainsMap(GlobalItem cspaceItem, ObjectTypeMapping& map) at
创建模型时无法使用上下文。

System.Data.Entity.Internal.LazyInternalContext.InitializeContext() at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType) at System.Data.Entity.Internal.Linq.InternalSet`1.Initialize()
基础提供程序在打开时失败。连接没有关闭。连接的当前状态为正在连接。

System.Data.Entity.Internal.LazyInternalContext.InitializeContext() at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType) at System.Data.Entity.Internal.Linq.InternalSet`1.Initialize()
该应用程序的结构是一个非常标准的MVC4应用程序,具有服务层和存储库层

  • 服务在构造函数中创建repo
  • 存储库在存储库构造函数中创建新上下文,如下所示:
公共类MyRepository:BaseRepository,IMyRepository

与构造器一起:

public MyRepository() : base(new MyEntities())
{
}
基本存储库如下所示:

public class BaseRepository<TEntity> where TEntity : class
{
    internal CRMEntities Context;
    internal DbSet<TEntity> dbSet;
    public BaseRepository(MyEntities context)
    {
        this.Context = context;
        dbSet = context.Set<TEntity>();
    }
}
公共类基本存储库,其中tenty:class
{
内部语境;
内部数据库集;
公共基础存储库(MyEntities上下文)
{
this.Context=Context;
dbSet=context.Set();
}
}
不应该有任何并发问题,因为我没有直接使用线程或异步

有什么想法吗?我的存储库结构可以改进吗?我已经使所有的构造函数都可以使用,但是我还没有使用IoC容器

在锁中包装存储库中上下文的构造是否值得?例如:

public class BaseRepository<TEntity> where TEntity : class
{
    internal MyEntities Context;
    internal DbSet<TEntity> dbSet;
    private static object _lock = new object();

    public BaseRepository(MyEntities context)
    {
        lock (_lock)
        {
            this.Context = context;
            dbSet = context.Set<TEntity>();
        }
    }
 }
公共类基本存储库,其中tenty:class
{
内部髓质背景;
内部数据库集;
私有静态对象_lock=新对象();
公共基础存储库(MyEntities上下文)
{
锁
{
this.Context=Context;
dbSet=context.Set();
}
}
}

它看起来非常像您的存储库(以及您的上下文)被多个请求使用。如果这是真的,那么这是对同一上下文实例的多线程使用,这是不受支持的——上下文不是线程安全的。仅锁定初始化是不够的。(另外,调用集不会初始化上下文。)您需要保护对上下文的所有访问,或者更恰当地使用具有短期上下文实例的每个请求的上下文模型。

感谢您的反馈-我明天回来工作时会查看代码库,但我非常确定该服务(它创建了一个repo)是短期的,不应在多个请求中使用。不过我一定会再检查一遍,让你知道。再次感谢阿金希·亚瑟-谢谢你让我重新检查代码,我注意到其中一份回购协议被标记为静态(没有真正的原因)。我认为这可能是导致它“徘徊”的原因。