5

NHibernateのためにCastleのISessionManagerによって生成されたISessionを閉じる必要がありますか?どうすればISessionの取引を処理できますか?私はまだNHibernateには全く新しいです。NHibernateキャッスルファシリティを使った遅延ロード

編集:[レイジー は、役割のコレクションを初期化に失敗しました

が初期化:私は希望は、遅延ロードを持っているが、私はこのメッセージを取得するには、何の セッションまたはセッションが閉じられませんでした」

ここで

は、私は特定のインスタンスを実装するために継承し、私の一般的なリポジトリである。

[Transactional] 
public class Repository<TKey, TModel> 
    : IRepository<TKey, TModel> 
    where TKey : IComparable 
    where TModel : class 
{ 
    private readonly ISessionManager _sessionManager; 

    protected ISession Session { get { return _sessionManager.OpenSession(); } } 

    public Repository(ISessionManager sessionManager) 
    { 
     _sessionManager = sessionManager; 
    } 
    #region IRepository<TKey,TModel> Members 

    public virtual TModel Select(TKey key) 
    { 
     using (var session = _sessionManager.OpenSession()) 
     { 
      return session.Get<TModel>(key); 
     } 
    } 

    public virtual IList<TModel> SelectWhere(Func<TModel, bool> query) 
    { 
     using (var session = Session) 
     { 
      return session.Linq<TModel>().Where(query).ToList(); 
     } 
    } 

    public virtual TModel Single(Func<TModel, bool> query) 
    { 
     using (var session = Session) 
     { 
      return session.Linq<TModel>().SingleOrDefault(query); 
     } 
    } 

    public virtual TModel First(Func<TModel, bool> query) 
    { 
     using (var session = Session) 
     { 
      return session.Linq<TModel>().FirstOrDefault(query); 
     } 
    } 

    public virtual IList<TModel> All() 
    { 
     using (var session = Session) 
     { 
      return session.Linq<TModel>().ToList(); 
     } 
    } 

    [Transaction(TransactionMode.Requires)] 
    public virtual void Store(TModel entity) 
    { 
     using (var session = Session) 
     { 
      session.SaveOrUpdate(entity); 
     } 
    } 

    [Transaction(TransactionMode.Requires)] 
    public virtual void Store(IEnumerable<TModel> entities) 
    { 
     using (var session = Session) 
     { 
      foreach (TModel entity in entities) 
       session.SaveOrUpdate(entity); 
     } 
    } 


    [Transaction(TransactionMode.Requires)] 
    public virtual void Remove(TModel entity) 
    { 
     using (var session = Session) 
     { 
      session.Delete(entity); 
     } 

    } 

    public virtual void Remove(Func<TModel, bool> query) 
    { 
     IEnumerable<TModel> entities = SelectWhere(query); 
     Remove(entities); 
    } 

    [Transaction(TransactionMode.Requires)] 
    public virtual void Remove(IEnumerable<TModel> entities) 
    { 
     using (var session = Session) 
     { 
      foreach (TModel entity in entities) 
       session.Delete(entity); 
     } 
    } 

    #endregion 
} 

public class Repository<TModel> 
    : Repository<Guid, TModel>, IRepository<TModel> 
    where TModel : class 
{ 
    public Repository(ISessionManager sessionManager) : base(sessionManager) { } 
} 

public class Repository 
    : Repository<ulong, object>, IRepository 
{ 
    public Repository(ISessionManager sessionManager) : base(sessionManager) { } 
} 
ここでは3210

はそのリポジトリのサンプル呼び出しです:

IUserRepository userRepository = new UserRepository(); // This is actually provided by my IoC 

var users = userRepository.All(); 
foreach (var user in Users) 
{ 
    foreach (var picture in user.Pictures) 
    { 
     // I get exceptions when I do stuff like this. 
    } 
} 

答えて

6

はい、常にISessionを配置します。 the docs on ISessionManager usageを参照してください。

トランザクションの場合は、Automatic Transaction Facilityの使用を検討してください。

SessionManager is ATM-awareISessionを明らかに処分した場合でも、取引を考慮して、必要なときにスマートに処理します。 ASP.NET MVC +城自動トランザクション施設+ NHibernateは施設

+0

遅延読み込みを行うにはどうすればよいですか? –

+0

本当に必要なのはサンプルコードです。 http://svn.castleproject.org:8080/svn/castle/trunk/Samples/MindDump/とテストを参照してください:http://svn.castleproject.org:8080/svn/castle/trunk/Facilities/NHibernateIntegration/Castle .Facilities.NHibernateIntegration.Tests/ –

+0

遅延ロード機能を示すファイルを指摘できますか? –

0

我々が破棄を処理するためのステートメントを使用してトランザクションを使用を使用しています

Here's a quick & dirty sample app

同じアクションで変更を加えた後にオブジェクトにアクセスしても、遅延読み込みエラーが発生します。私は保存後にオブジェクトにアクセスしないことでエラーを修正しました。 NHibernate.LazyInitializationException

これは階層が正しく保存されていないためだと思います。私はそれをテストしていませんが、あなたがそれらにアクセスしたい場合、親オブジェクトを保存することは、問題を解決するでしょう。保存前にローカル変数に保存した後にアクセスしなければならなかった情報を保存するだけで、問題が解決されたようです。

関連する問題