using System; using System.Collections.Generic; using System.Linq.Expressions; using NHibernate; namespace Tanshu.Accounts.Repository { public class FluentGenericBase : IDisposable, IRepository where T : class { protected readonly bool DisposeSession; protected readonly ISession Session; protected readonly ITransaction Transaction; public FluentGenericBase() { Session = SessionManager.Session; DisposeSession = true; Transaction = Session.BeginTransaction(); } public FluentGenericBase(bool beginTransaction) { Session = SessionManager.Session; DisposeSession = true; if (beginTransaction) Transaction = Session.BeginTransaction(); } public FluentGenericBase(ISession session) { this.Session = session; DisposeSession = false; } public FluentGenericBase(ISession session, bool beginTransaction) { this.Session = session; DisposeSession = false; if (beginTransaction) Transaction = Session.BeginTransaction(); } #region IDisposable Members public void Dispose() { if (Transaction != null) { Transaction.Commit(); Transaction.Dispose(); } if (DisposeSession && Session != null) Session.Dispose(); } //public void Dispose() //{ // Dispose(true); // GC.SuppressFinalize(this); //} //protected virtual void Dispose(bool disposing) //{ // if (Transaction != null) // { // Transaction.Commit(); // Transaction.Dispose(); // } // if (DisposeSession && Session != null) // Session.Dispose(); // if (disposing) // { // // get rid of managed resources // } // // get rid of unmanaged resources //} //~FluentGenericBase() //{ // Dispose(false); //} #endregion #region IRepository Members public void Insert(T item) { Session.Save(item); } public void Update(T item) { Session.Update(item); } public void Delete(T item) { Session.Delete(item); } public void Delete(Expression> query) { Delete(Get(query)); } public void DeleteList(Expression> query) { foreach (T item in List(query)) Delete(item); } public T Get(Expression> query) { return Session.QueryOver() .Where(query) .SingleOrDefault(); } public IList List() { return Session.CreateCriteria() .List(); } public IList List(Expression> query) { return Session.QueryOver() .Where(query) .List(); } public void DeleteList(IList list) { foreach (T item in list) Delete(item); } public IQueryOver Query() { return Session.QueryOver(); } #endregion } }