2012-11-05 13 views
0

我已經完成了一個新的應用程序,現在已經部署到實時環境中,但是我的全局錯誤處理程序在一天中多次提取這些異常。這些錯誤是分批進行的,並且是大膽的四個之一。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>(); 
     } 
    } 
} 

回答

1

它看起來非常像您的存儲庫(因此您的上下文)被多個請求使用。如果這是真的,那麼這是多線程使用相同的上下文實例,不支持 - 上下文不是線程安全的。只鎖定初始化是不夠的。 (此外,調用Set不會初始化上下文。)您需要保護對上下文的所有訪問,或者更適合地使用每個具有短期上下文實例的請求模型的上下文。

+0

感謝您的反饋 - 我會看看代碼庫的明天,當我回來上班,但我敢肯定的服務(這將創建一個回購協議)是短暫的,不應該被使用在多個請求中。我絕對會再次檢查,並讓你知道。再次感謝 – DaveHogan

+0

嗨亞瑟 - 感謝您指示我重新查看代碼,並且我注意到其中一個回購被標記爲靜態(無真正原因)。我假設它可能是導致它「掛起」的原因。 – DaveHogan