5

Tôi có phải đóng ISession được tạo bởi Castle ISessionManager cho NHibernate không? Tôi làm cách nào để xử lý các giao dịch với các giao dịch của ISession? Tôi vẫn còn khá mới với NHibernate.Tải trọng lười biếng với Cơ sở Lâu đài NHibernate

Edit: Tôi muốn có tải lười biếng nhưng tôi nhận được tin nhắn này:

Khởi [thất bại trong việc uể oải khởi tạo một tập hợp các vai trò:, không phiên hoặc phiên đã được đóng cửa"

đây là Repository generic của tôi mà tôi kế thừa để thực hiện các trường hợp cụ thể.

[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) { } 
} 

Đây là một cách gọi mẫu của kho rằng:

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. 
    } 
} 

Trả lời

6

Vâng, lúc nào cũng vứt bỏ các ISession. Xem the docs on ISessionManager usage.

Đối với giao dịch, hãy xem xét sử dụng Automatic Transaction Facility.

SessionManager is ATM-aware để nó sẽ xử lý ISession một cách thông minh khi cần, tính đến các giao dịch ngay cả khi bạn đã xử lý ISession.

Here's a quick & dirty sample app sử dụng cơ sở ASP.NET MVC + Lâu đài tự động giao dịch + NHibernate cơ sở

+0

Làm cách nào để tải chậm? –

+0

Điều bạn thực sự cần là một số mã mẫu. Xem http://svn.castleproject.org:8080/svn/castle/trunk/Samples/MindDump/ và các bài kiểm tra: http://svn.castleproject.org:8080/svn/castle/trunk/Facilities/NHibernateIntegration/Castle .Facilities.NHibernateIntegration.Tests/ –

+0

Bạn có thể chỉ cho tôi một tệp cho thấy hoạt động tải chậm không? –

0

Chúng tôi sử dụng các giao dịch bằng cách sử dụng báo cáo để xử lý các xử lý.

public void Save<K>(K entity) 
     { 

      if (entity == null) 
       throw new ArgumentNullException("item", "The item being saved cannot be null."); 

      using (ISession session = GetSession()) 
      { 
       using (ITransaction tx = session.BeginTransaction()) 
       { 
        session.SaveOrUpdate(entity); 
        tx.Commit(); 
       } 
      } 
     } 

Tôi vẫn sẽ gặp lỗi tải chậm nếu tôi truy cập các đối tượng sau khi thực hiện sửa đổi trong cùng một hành động. Tôi đã sửa lỗi bằng cách không truy cập vào các đối tượng sau khi lưu. Đây là một giải thích: NHibernate.LazyInitializationException

Tôi tin rằng đó là do không lưu hệ thống phân cấp chính xác. Tôi đã không thử nghiệm nó, nhưng có thể lưu các đối tượng cha mẹ nếu bạn muốn truy cập chúng sẽ khắc phục vấn đề. Chỉ cần đặt thông tin tôi cần truy cập sau khi lưu vào các biến cục bộ trước khi lưu có vẻ như để sửa vấn đề của tôi.

Các vấn đề liên quan