BaseFactory.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. using CD67.FicheCollege.Entity;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Data.Entity;
  5. using System.IO;
  6. using System.Linq;
  7. using System.Linq.Dynamic;
  8. using System.Linq.Expressions;
  9. using System.Reflection;
  10. using System.Runtime.Serialization;
  11. using System.Text;
  12. using System.Threading.Tasks;
  13. namespace CD67.FicheCollege.Factory.Internal
  14. {
  15. /// <summary>
  16. /// Classe de base pour toutes les classes spécialisées de la couche de service
  17. /// </summary>
  18. public class BaseFactory<T> : IDisposable where T : class
  19. {
  20. /// <summary>
  21. /// Context Entity Framework utilisé dans la classe
  22. /// </summary>
  23. protected Entities dbContext;
  24. #region Constructeurs
  25. /// <summary>
  26. /// Constructeur sans argument pour les classes sans contexts Entity
  27. /// </summary>
  28. public BaseFactory() { }
  29. /// <summary>
  30. /// Constructeur avec initialisation du context Entity Framework
  31. /// </summary>
  32. /// <param name="dbContext">Context Entity Framework</param>
  33. public BaseFactory(Entities dbContext)
  34. {
  35. this.dbContext = dbContext;
  36. }
  37. #endregion
  38. #region Méthodes génériques
  39. private DbSet<T> ObjectSet
  40. {
  41. get
  42. {
  43. return this.dbContext.Set<T>();
  44. }
  45. }
  46. public virtual T getById(params object[] keyValues)
  47. {
  48. return ObjectSet.Find(keyValues);
  49. }
  50. public virtual T getBy(Expression<Func<T, bool>> expression)
  51. {
  52. return ObjectSet.Where(expression).FirstOrDefault();
  53. }
  54. public virtual T getBy(string dynamicExpression)
  55. {
  56. return ObjectSet.Where(dynamicExpression).FirstOrDefault();
  57. }
  58. public virtual IQueryable<T> getAll()
  59. {
  60. return getAll(null);
  61. }
  62. public virtual IQueryable<T> getAll(string sortParameter = null)
  63. {
  64. if (sortParameter != null) return ObjectSet.OrderBy(sortParameter);
  65. else return ObjectSet;
  66. }
  67. public virtual IQueryable<T> getManyBy(Expression<Func<T, bool>> expression, string sortParameter = null)
  68. {
  69. IQueryable<T> query = ObjectSet.Where(expression);
  70. if (sortParameter != null) query = query.OrderBy(sortParameter);
  71. return query;
  72. }
  73. public virtual IQueryable<T> getManyBy(string dynamicExpression, string sortParameter = null)
  74. {
  75. IQueryable<T> query = ObjectSet.Where(dynamicExpression);
  76. if (sortParameter != null) query = query.OrderBy(sortParameter);
  77. return query;
  78. }
  79. public virtual void add(ref T entity)
  80. {
  81. ObjectSet.Add(entity);
  82. dbContext.SaveChanges();
  83. }
  84. public virtual void addMany(ref List<T> entities)
  85. {
  86. ObjectSet.AddRange(entities);
  87. dbContext.SaveChanges();
  88. }
  89. public virtual void update(ref T entity)
  90. {
  91. // On attache l'objet en paramètre au contexte, on le note bien comme modifié pour qu'il soit mis à jour
  92. ObjectSet.Attach(entity);
  93. dbContext.Entry(entity).State = EntityState.Modified;
  94. dbContext.SaveChanges();
  95. }
  96. public virtual void updateMany(ref List<T> entities)
  97. {
  98. foreach (var item in entities)
  99. {
  100. // On attache l'objet en paramètre au contexte, on le note bien comme modifié pour qu'il soit mis à jour
  101. ObjectSet.Attach(item);
  102. dbContext.Entry(item).State = EntityState.Modified;
  103. }
  104. dbContext.SaveChanges();
  105. }
  106. public virtual void updateMany(Expression<Func<T, bool>> expression)
  107. {
  108. List<T> query = ObjectSet.Where(expression).ToList();
  109. this.updateMany(ref query);
  110. }
  111. public virtual void updateMany(string dynamicExpression)
  112. {
  113. List<T> query = ObjectSet.Where(dynamicExpression).ToList();
  114. this.updateMany(ref query);
  115. }
  116. public virtual void delete(ref T entity)
  117. {
  118. ObjectSet.Remove(entity);
  119. dbContext.SaveChanges();
  120. }
  121. public virtual void deleteMany(ref List<T> entities)
  122. {
  123. ObjectSet.RemoveRange(entities);
  124. dbContext.SaveChanges();
  125. }
  126. public virtual void deleteMany(Expression<Func<T, bool>> expression)
  127. {
  128. List<T> query = ObjectSet.Where(expression).ToList();
  129. this.deleteMany(ref query);
  130. }
  131. public virtual void deleteMany(string dynamicExpression)
  132. {
  133. List<T> query = ObjectSet.Where(dynamicExpression).ToList();
  134. this.deleteMany(ref query);
  135. }
  136. #endregion
  137. #region Dispose
  138. private bool disposed = false;
  139. /// <summary>
  140. /// Fonction pour détruire proprement la classe après utilisation
  141. /// </summary>
  142. /// <param name="disposing"></param>
  143. protected virtual void Dispose(bool disposing)
  144. {
  145. if (!this.disposed)
  146. {
  147. if (disposing)
  148. {
  149. dbContext.Dispose();
  150. }
  151. }
  152. this.disposed = true;
  153. }
  154. /// <summary>
  155. /// Fonction pour détruire proprement la classe après utilisation
  156. /// </summary>
  157. public void Dispose()
  158. {
  159. Dispose(true);
  160. GC.SuppressFinalize(this);
  161. }
  162. #endregion
  163. }
  164. }