1

概要

ISessionMVC 4 RC プロジェクトでNHibernate を管理するために Autofac を接続しようとしています。私が理解したことから、Autofac はISession.Dispose各 HTTP リクエストの最後に、私が設定した方法で呼び出す必要があります (以下を参照)。ただし、そうではないようです。 を呼び出さないとISession.Flush()、データはデータベースに保持されません。

構成

オートファク

container.Register(c => DbConfig.Generate(connectionString).BuildSessionFactory())
    .As<ISessionFactory>()
    .SingleInstance();

container.Register(c => c.Resolve<ISessionFactory>().OpenSession())
    .As<ISession>()
    .InstancePerLifetimeScope();
    
container.RegisterGeneric(typeof(Repository<>))
    .As(typeof(IRepository<>))
    .InstancePerLifetimeScope();

リポジトリ

public class Repository<T> : IRepository<T> where T : class
{
    protected readonly ISession Session;
    
    public Repository(ISession session)
    {
        Session = session;
    }

    public void Add(T entity)
    {
        Session.Save(entity);
    }
}

データベース シード (Application_Start)

public class DatabaseSeed
{
    public static void Seed(IContainer container)
    {
        var session = container.Resolve<ISession>();
        var userRepo = container.Resolve<IRepository<User>>();
        userRepo.Add(new User { Id = 5, Name = "Test User" });
        
        //session.Flush(); <-- if not called, user will not be persisted!
    }
}

閉会の辞

これをトランザクションでラップする必要があることは知っています。ただし、より複雑なシナリオに進む前に基本を機能させたいと考えており、上記が期待どおりに機能しない理由について困惑しています...

(補足として、Autofac の「プロファイラー」である Whitebox を実行してみましたが、いくつかの例外を除いて失敗します (Autofac グループ @ Google に投稿)。 NHibernate :-)

4

2 に答える 2

3

トランザクションをコミットすると、セッションがフラッシュされます。トランザクションは基本の一部です。

- または -

NHibernate のログを有効にすると、AutoFac がセッションを破棄するかどうか、および NHibernate が自身をフラッシュするかどうかがわかります。

セッションがライフタイムスコープの最後に破棄されるように AutoFac を構成しました。ライフタイム スコープが http 要求と一致するように設定した場所はどこですか?


アップデート

自分でテストしたところ、セッションが破棄された場合、セッションはフラッシュされません。通常使用するトランザクションは、セッションが破棄される前にコミットされるため、これは理にかなっています。それ以外の場合、セッションはトランザクションの外部でフラッシュされます。

したがって、flushmode を「Always」に設定するか、トランザクションを使用してください。最初の回答で述べたように、トランザクション基本の一部です。

于 2012-07-25T09:23:54.610 に答える
1

私のお気に入りの DI フレームワークは Spring.NET とその XML であるため、AutoFac については何も知りません :)。しかし、オブジェクトへの変更がどうにかして持続しなかったという問題は、私にとって非常によく知られています。私が得たすべてのケースで、それらはフラッシュモードとトランザクションに関連しています。これらを次の手順で処理します。

最初にチェックするのはトランザクションです。配置されましたか?少なくともすべての更新/削除をトランザクションで行うことを強くお勧めします。トランザクションが開始されたとしましょう。

フラッシュモードになります。セッションのフラッシュモードは何ですか? コミットの場合は、変更を永続化する必要があります。Auto の場合は、変更も保持する必要があります。したがって、Session.Flush() を使用して手動でフラッシュする必要があるのは Never だったと思います。

于 2012-07-25T13:30:39.447 に答える