2012-07-16 56 views
1

將autofac用作我的IoC框架。
我希望能夠在我的應用程序的啓動中設置我的DbContext實例。Entity Framework + Autofac - 保存時出現隨機錯誤

在我的ASP.NET MVC 3項目中,我在Global.asax(PerLifetimeScope)中註冊了DbContext實例。但是,當我一次在多個瀏覽器(或多個選項卡)上啓動我的網站時,有時當我嘗試將更改保存回數據庫時,我得到Object reference not set to an instance of an object.New transaction is not allowed because there are other threads running in the session。有時當我想從數據庫讀取數據時,我也會得到 ExecuteReader requires an open and available Connection. The connection's current state: Broken.

錯誤似乎隨機彈出,我懷疑它與我的上下文的生命週期範圍有關。這裏是我的DbContext的重寫方法SaveChange

public class MyContext : DbContext 
{ 
    public override int SaveChanges() 
    { 
     var result = base.SaveChanges(); // Exception here 
    } 
} 

這裏是我如何註冊我的上下文:

builder.Register(c => new MyContext("SomeConnectionString")) 
       .InstancePerLifetimeScope(); 

如果我只是在瀏覽器中的一切工作正常我的一個網站打開的選項卡。
另外,值得一提的是,我通過調用一個使用Ajax的控制器方法,在我的網站中每隔5-10秒就對數據庫執行CRUD操作。

堆棧跟蹤爲New transaction is not allowed because there are other threads running in the session

at System.Data.EntityClient.EntityConnection.BeginDbTransaction(IsolationLevel isolationLevel) 
at System.Data.EntityClient.EntityConnection.BeginTransaction() 
at System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options) 
at System.Data.Entity.Internal.InternalContext.SaveChanges() 
at System.Data.Entity.Internal.LazyInternalContext.SaveChanges() 
at System.Data.Entity.DbContext.SaveChanges() 
at MyProject.Data.MyContext.SaveChanges() in D:\Test.cs 

堆棧跟蹤爲Object reference not set to an instance of an object.

註冊
at System.Data.Objects.ObjectStateManager.DetectConflicts(IList`1 entries) 
at System.Data.Objects.ObjectStateManager.DetectChanges() 
at System.Data.Entity.Internal.InternalContext.DetectChanges(Boolean force) 
at System.Data.Entity.Internal.InternalContext.GetStateEntries(Func`2 predicate) 
at System.Data.Entity.Internal.InternalContext.GetStateEntries() 
at System.Data.Entity.Infrastructure.DbChangeTracker.Entries() 
at System.Data.Entity.DbContext.GetValidationErrors() 
at System.Data.Entity.Internal.InternalContext.SaveChanges() 
at System.Data.Entity.Internal.LazyInternalContext.SaveChanges() 
at System.Data.Entity.DbContext.SaveChanges() 
at MyProject.Data.MyContext.SaveChanges() in D:\Test.cs at 
+0

對此是否有幫助? http://stackoverflow.com/questions/6237280/new-transaction-is-not-allowed-because-there-are-other-threads-running-in-the-se – Boomer 2012-07-16 13:54:09

+0

我的理解是'InstancePerLifetimeScope'應該處理上下文創建/分別處理每個「HttpRequest」。如果不是,那麼您是否有任何引用爲我的上下文編寫自定義生命週期範圍管理器? – Kamyar 2012-07-16 13:56:31

+0

我也注意到這個問題 – 2012-07-30 17:09:28

回答

1

MyContext看起來確定。是否有可能需要一個MyContext的其他服務被註冊爲單例並且在線程之間共享?

+0

從來沒有想到這一點。你對一個能夠訪問上下文的單身人士是正確的,但即使在刪除之後,我仍然會看到奇怪的上下文錯誤。我會盡力挖掘更多。 – Kamyar 2012-07-17 08:03:51

1

我有同樣的問題,零星的錯誤與DbContext相關,而使用Autofac來解決DbContext。

{System.Data.EntityCommandExecutionException: An error occurred while executing the command definition. See the inner exception for details. 
etc. 

{System.NullReferenceException: Object reference not set to an instance of an object. 
at System.Data.Objects.ObjectStateManager.DetectConflicts(IList`1 entries) 
etc. 

我在代碼中發現了類似下面的類。依賴關係解析發生在單例內部的靜態方法內。被解析的對象具有對DbContext的依賴。在我找到一種方法來重組這個類以便它不再是一個單身人士之後,我還沒有任何其他問題。

也許你有類似的情況?另一件嘗試可能是使您的DbContext InstancePerHttpRequest。這可以幫助確定這是否是問題。

public class Singleton 
{ 
    private static Singleton _instance = new Singleton(); 

    private Singleton() 
    { 

    } 

    public static void DoSomething<TSource>(TSource source) where TSource : ISource 
    { 
     var items = DependencyResolver.Current.Resolve<IEnumerable<IDbContextConsumer<TSource>>>(); 
     foreach (var item in items) 
     { 
      item.Execute(source); 
     } 
    } 
} 
相關問題