0

次のような UnitOfWork クラスを持つ Azure ワーカー ロールがあります。

public class UnitOfWork : IUnitOfWork
{
    public MyData Db { get; private set; }

    public ILoginRepository LoginRepository { get; private set; }
    public ISubscriptionRepository SubscriptionRepository { get; private set; }

    public UnitOfWork(MyData db,
        ILoginRepository loginRepository,
        ISubscriptionRepository subscriptionRepository)
    {
    }
}

リポジトリは、DbContext への参照も受け入れます。

public class LoginRepository : Repository<Login>, ILoginRepository
{
    public LoginRepository(MyData db) : base(db) { }
}

これはかなり簡単だと思います。

ここで、UnitOfWork が解決されるたびに新しい DbContext が作成され、その後解決されるすべてのリポジトリもそれを取得するように、Unity でコード ファーストの DbContext を構成したいと思います。

PerResolveLifetimeManager がうまくいくと思います:

container.RegisterType<IUnitOfWork, UnitOfWork>();
container.RegisterType<MyData, MyData>(new PerResolveLifetimeManager());

しかし、そうではありません。次のような奇妙な SQL 関連のエラーがすべて表示されます。

「セッションで他のスレッドが実行されているため、新しいトランザクションは許可されません。」

何を与える?

4

2 に答える 2

0

あなたは話してPerResolveLifetimeManagerいますがPerThreadLifetimeManager、コードで(とにかくバグがあると言われています)を使用しています。それがあなたの問題の原因かもしれませんか?

于 2012-06-22T06:06:37.680 に答える
0

解決策をリファクタリングして、.ctor インジェクションの代わりに、より明示的な Resolve 呼び出しを行うようにしました。結局、主な問題は、オブジェクトを含む IQueryable を反復処理しながらオブジェクトを更新しようとすることにあることに気付きました。

何もないことについて大騒ぎしているように思えます。

助けてくれてありがとう。

于 2012-06-22T19:33:04.537 に答える