1

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 sessionExecuteReader 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 
4

2 に答える 2

1

の登録はMyContext問題ないようです。を取る他のサービスがMyContextシングルトンとして登録され、スレッド間で共有されている可能性はありますか?

于 2012-07-16T14:03:18.983 に答える
1

Autofacを使用してDbContextを解決しているときに、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 に依存していました。このクラスがシングルトンではなくなるように再構築する方法を見つけた後、追加の問題は発生していません。

もしかして、あなたも似たような状況ですか?もう 1 つ試すことは、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);
        }
    }
}
于 2012-07-30T18:38:58.923 に答える