using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using NHibernate; using NHibernate.Linq; using Expression=NHibernate.Criterion.Expression; namespace DeveloperAchievements.DataAccess.NHibernate { public class Repository : IRepository, IDisposable { private readonly ISession _session; public ISession Session { get { return _session; } } public Repository(ISession Session) { _session = Session; } public virtual T FindByKey(string key) where T : KeyedEntity { var criteria = Session.CreateCriteria(typeof(T)); criteria.Add(Expression.Eq("Key", key)); var result = criteria.UniqueResult(); return ReferenceEquals(null, result) ? null : result; } public IEnumerable FindByQuery(Func query) where T : KeyedEntity { return Session.Linq().Where(query).ToArray(); } public void SaveAll(IEnumerable entities) where T : KeyedEntity { using (var tx = Session.BeginTransaction()) { foreach (var entity in entities) InternalSave(entity); tx.Commit(); } } public void Delete(T target) where T : KeyedEntity { using (ITransaction tx = Session.BeginTransaction()) { Session.Delete(target); tx.Commit(); } } public T Find(long id) where T : KeyedEntity { var result = Session.Get(id); return ReferenceEquals(null, result) ? null : result; } public T FindBy(Expression> where) where T : KeyedEntity { return Session.Linq().Where(where).FirstOrDefault(); } public IEnumerable Query(Expression> where) where T : KeyedEntity { return Session.Linq().Where(where); } public virtual void Save(T entity) where T : KeyedEntity { using (var tx = Session.BeginTransaction()) { InternalSave(entity); tx.Commit(); } } private void InternalSave(T entity) where T : KeyedEntity { if (entity == null) throw new ArgumentNullException("entity"); //entity.ValidateWithException(); Session.SaveOrUpdate(entity); } public void Flush() { Session.Flush(); } public void Dispose() { Session.Dispose(); } } }