我已經完成了一個新的應用程序,現在已經部署到實時環境中,但是我的全局錯誤處理程序在一天中多次提取這些異常。這些錯誤是分批進行的,並且是大膽的四個之一。EF5/Base Repository的併發問題
MVC 4,IIS 6,Windows Server 2003中,淨。4.0,EF 5(最新從的NuGet)
類型「ARandomModelInMyContext」已被映射不止一次。
指數超出範圍。必須是非負數且小於集合的大小。被創建的模型而
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()
底層提供對打開失敗。連接未關閉。連接的當前狀態正在連接。
該應用程序的結構是一個非常標準的MVC4應用程序,具有服務層和存儲庫層。
- 服務會在構造回購
- 庫創建存儲庫中的構造函數,像這樣一個新的語境:
public class MyRepository : BaseRepository<MyModel>, 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>();
}
}
不應該有任何併發問題,因爲我沒有直接使用任何線程或異步。
任何想法?我的存儲庫結構可以改進嗎?我已經使所有的構造函數都可以使用,但是我還沒有使用IoC容器。
將lock的構建包裝在倉庫中值得嗎?例如:
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>();
}
}
}
感謝您的反饋 - 我會看看代碼庫的明天,當我回來上班,但我敢肯定的服務(這將創建一個回購協議)是短暫的,不應該被使用在多個請求中。我絕對會再次檢查,並讓你知道。再次感謝 – DaveHogan
嗨亞瑟 - 感謝您指示我重新查看代碼,並且我注意到其中一個回購被標記爲靜態(無真正原因)。我假設它可能是導致它「掛起」的原因。 – DaveHogan