using CD67.ModeleMVC.Entity; using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; using System.Linq.Dynamic; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; namespace CD67.ModeleMVC.Factory.Internal { /// /// Classe de base pour toutes les classes spécialisées de la couche de service /// public class BaseFactory : IDisposable where T : class { /// /// Context Entity Framework utilisé dans la classe /// protected Entities dbContext; #region Constructeurs /// /// Constructeur sans argument pour les classes sans contexts Entity /// public BaseFactory() { } /// /// Constructeur avec initialisation du context Entity Framework /// /// Context Entity Framework public BaseFactory(Entities dbContext) { this.dbContext = dbContext; } #endregion #region Méthodes génériques private DbSet ObjectSet { get { return this.dbContext.Set(); } } public virtual T getById(params object[] keyValues) { return ObjectSet.Find(keyValues); } public virtual T getBy(Expression> expression) { return ObjectSet.Where(expression).FirstOrDefault(); } public virtual T getBy(string dynamicExpression) { return ObjectSet.Where(dynamicExpression).FirstOrDefault(); } public virtual IQueryable getAll() { return getAll(null); } public virtual IQueryable getAll(string sortParameter = null) { if (sortParameter != null) return ObjectSet.OrderBy(sortParameter); else return ObjectSet; } public virtual IQueryable getManyBy(Expression> expression, string sortParameter = null) { IQueryable query = ObjectSet.Where(expression); if (sortParameter != null) query = query.OrderBy(sortParameter); return query; } public virtual IQueryable getManyBy(string dynamicExpression, string sortParameter = null) { IQueryable query = ObjectSet.Where(dynamicExpression); if (sortParameter != null) query = query.OrderBy(sortParameter); return query; } public virtual void add(ref T entity) { ObjectSet.Add(entity); dbContext.SaveChanges(); } public virtual void addMany(ref List entities) { ObjectSet.AddRange(entities); dbContext.SaveChanges(); } public virtual void update(ref T entity) { // On attache l'objet en paramètre au contexte, on le note bien comme modifié pour qu'il soit mis à jour ObjectSet.Attach(entity); dbContext.Entry(entity).State = EntityState.Modified; dbContext.SaveChanges(); } public virtual void updateMany(ref List entities) { foreach (var item in entities) { // On attache l'objet en paramètre au contexte, on le note bien comme modifié pour qu'il soit mis à jour ObjectSet.Attach(item); dbContext.Entry(item).State = EntityState.Modified; } dbContext.SaveChanges(); } public virtual void updateMany(Expression> expression) { List query = ObjectSet.Where(expression).ToList(); this.updateMany(ref query); } public virtual void updateMany(string dynamicExpression) { List query = ObjectSet.Where(dynamicExpression).ToList(); this.updateMany(ref query); } public virtual void delete(ref T entity) { ObjectSet.Remove(entity); dbContext.SaveChanges(); } public virtual void deleteMany(ref List entities) { ObjectSet.RemoveRange(entities); dbContext.SaveChanges(); } public virtual void deleteMany(Expression> expression) { List query = ObjectSet.Where(expression).ToList(); this.deleteMany(ref query); } public virtual void deleteMany(string dynamicExpression) { List query = ObjectSet.Where(dynamicExpression).ToList(); this.deleteMany(ref query); } #endregion #region Dispose private bool disposed = false; /// /// Fonction pour détruire proprement la classe après utilisation /// /// protected virtual void Dispose(bool disposing) { if (!this.disposed) { if (disposing) { dbContext.Dispose(); } } this.disposed = true; } /// /// Fonction pour détruire proprement la classe après utilisation /// public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } #endregion } }