將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
對此是否有幫助? 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
我的理解是'InstancePerLifetimeScope'應該處理上下文創建/分別處理每個「HttpRequest」。如果不是,那麼您是否有任何引用爲我的上下文編寫自定義生命週期範圍管理器? – Kamyar 2012-07-16 13:56:31
我也注意到這個問題 – 2012-07-30 17:09:28