autofac を IoC フレームワークとして使用しています。アプリケーションの起動時
にインスタンスをセットアップできるようにしたいと考えています。DbContext
私の ASP.NET MVC 3 プロジェクトでは、DbContext
インスタンスを Global.asax に登録します ( PerLifetimeScope
)。しかし、一度に複数のブラウザー (または複数のタブ) でサイトを起動すると、データベースに変更を保存しようとすると、または取得することがあります。また
、データベースからデータを読みたいときに時々取得します。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();
ブラウザで自分のサイトの開いているタブが 1 つだけの場合、すべて正常に動作します。
また、Ajaxを使用してコントローラーメソッドを呼び出すことにより、Webサイトで5〜10秒ごとにdbで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