EfRepository.cs 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data.Entity;
  4. using System.Data.Entity.Validation;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. using GreenTree.Nachtragsmanagement.Core;
  9. using GreenTree.Nachtragsmanagement.Core.Data;
  10. namespace GreenTree.Nachtragsmanagement.Data
  11. {
  12. public class EfRepository<T> : IRepository<T> where T : BaseEntity
  13. {
  14. #region Fields
  15. private readonly IDbContext _context;
  16. private IDbSet<T> _entities;
  17. #endregion
  18. #region Ctor
  19. /// <summary>
  20. /// Ctor
  21. /// </summary>
  22. /// <param name="context">Object context</param>
  23. public EfRepository(IDbContext context)
  24. {
  25. _context = context;
  26. }
  27. #endregion
  28. #region Methods
  29. /// <summary>
  30. /// Get entity by identifier
  31. /// </summary>
  32. /// <param name="id">Identifier</param>
  33. /// <returns>Entity</returns>
  34. public virtual T GetById(object id)
  35. {
  36. //see some suggested performance optimization (not tested)
  37. //http://stackoverflow.com/questions/11686225/dbset-find-method-ridiculously-slow-compared-to-singleordefault-on-id/11688189#comment34876113_11688189
  38. return Entities.Find(id);
  39. }
  40. /// <summary>
  41. /// Insert entity
  42. /// </summary>
  43. /// <param name="entity">Entity</param>
  44. public virtual void Insert(T entity)
  45. {
  46. try
  47. {
  48. if (entity == null)
  49. throw new ArgumentNullException("entity");
  50. Entities.Add(entity);
  51. _context.SaveChanges();
  52. }
  53. catch (DbEntityValidationException dbEx)
  54. {
  55. var msg = string.Empty;
  56. foreach (var validationErrors in dbEx.EntityValidationErrors)
  57. foreach (var validationError in validationErrors.ValidationErrors)
  58. msg += string.Format("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage) + Environment.NewLine;
  59. var fail = new Exception(msg, dbEx);
  60. //Debug.WriteLine(fail.Message, fail);
  61. throw fail;
  62. }
  63. }
  64. /// <summary>
  65. /// Insert entities
  66. /// </summary>
  67. /// <param name="entities">Entities</param>
  68. public virtual void Insert(IEnumerable<T> entities)
  69. {
  70. try
  71. {
  72. if (entities == null)
  73. throw new ArgumentNullException("entities");
  74. foreach (var entity in entities)
  75. Entities.Add(entity);
  76. _context.SaveChanges();
  77. }
  78. catch (DbEntityValidationException dbEx)
  79. {
  80. var msg = string.Empty;
  81. foreach (var validationErrors in dbEx.EntityValidationErrors)
  82. foreach (var validationError in validationErrors.ValidationErrors)
  83. msg += string.Format("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage) + Environment.NewLine;
  84. var fail = new Exception(msg, dbEx);
  85. //Debug.WriteLine(fail.Message, fail);
  86. throw fail;
  87. }
  88. }
  89. /// <summary>
  90. /// Update entity
  91. /// </summary>
  92. /// <param name="entity">Entity</param>
  93. public virtual void Update(T entity)
  94. {
  95. try
  96. {
  97. if (entity == null)
  98. throw new ArgumentNullException("entity");
  99. _context.SaveChanges();
  100. }
  101. catch (DbEntityValidationException dbEx)
  102. {
  103. var msg = string.Empty;
  104. foreach (var validationErrors in dbEx.EntityValidationErrors)
  105. foreach (var validationError in validationErrors.ValidationErrors)
  106. msg += Environment.NewLine + string.Format("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage);
  107. var fail = new Exception(msg, dbEx);
  108. //Debug.WriteLine(fail.Message, fail);
  109. throw fail;
  110. }
  111. }
  112. /// <summary>
  113. /// Delete entity
  114. /// </summary>
  115. /// <param name="entity">Entity</param>
  116. public virtual void Delete(T entity)
  117. {
  118. try
  119. {
  120. if (entity == null)
  121. throw new ArgumentNullException("entity");
  122. Entities.Remove(entity);
  123. _context.SaveChanges();
  124. }
  125. catch (DbEntityValidationException dbEx)
  126. {
  127. var msg = string.Empty;
  128. foreach (var validationErrors in dbEx.EntityValidationErrors)
  129. foreach (var validationError in validationErrors.ValidationErrors)
  130. msg += Environment.NewLine + string.Format("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage);
  131. var fail = new Exception(msg, dbEx);
  132. //Debug.WriteLine(fail.Message, fail);
  133. throw fail;
  134. }
  135. }
  136. /// <summary>
  137. /// Delete entities
  138. /// </summary>
  139. /// <param name="entities">Entities</param>
  140. public virtual void Delete(IEnumerable<T> entities)
  141. {
  142. try
  143. {
  144. if (entities == null)
  145. throw new ArgumentNullException("entities");
  146. foreach (var entity in entities)
  147. Entities.Remove(entity);
  148. _context.SaveChanges();
  149. }
  150. catch (DbEntityValidationException dbEx)
  151. {
  152. var msg = string.Empty;
  153. foreach (var validationErrors in dbEx.EntityValidationErrors)
  154. foreach (var validationError in validationErrors.ValidationErrors)
  155. msg += Environment.NewLine + string.Format("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage);
  156. var fail = new Exception(msg, dbEx);
  157. //Debug.WriteLine(fail.Message, fail);
  158. throw fail;
  159. }
  160. }
  161. #endregion
  162. #region Properties
  163. /// <summary>
  164. /// Gets a table
  165. /// </summary>
  166. public virtual IQueryable<T> Table
  167. {
  168. get
  169. {
  170. return Entities;
  171. }
  172. }
  173. /// <summary>
  174. /// Gets a table with "no tracking" enabled (EF feature) Use it only when you load record(s) only for read-only operations
  175. /// </summary>
  176. public virtual IQueryable<T> TableNoTracking
  177. {
  178. get
  179. {
  180. return Entities.AsNoTracking();
  181. }
  182. }
  183. /// <summary>
  184. /// Entities
  185. /// </summary>
  186. protected virtual IDbSet<T> Entities
  187. {
  188. get
  189. {
  190. if (_entities == null)
  191. _entities = _context.Get<T>();
  192. return _entities;
  193. }
  194. }
  195. #endregion
  196. }
  197. }