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