using System; using System.Collections.Generic; using System.Data.Entity; using System.Data.Entity.Validation; using System.Linq; namespace PalGain.Core { /// /// Entity Framework repository /// public partial class EfRepository : IRespository where T : BaseEntity { #region Fields private readonly IDbContext _context; private IDbSet _entities; #endregion #region Ctor /// /// Ctor /// /// Object context public EfRepository(IDbContext context) { this._context = context; } #endregion #region Methods /// /// Get entity by identifier /// /// Identifier /// Entity public virtual T GetById(object id) { //see some suggested performance optimization (not tested) //http://stackoverflow.com/questions/11686225/dbset-find-method-ridiculously-slow-compared-to-singleordefault-on-id/11688189#comment34876113_11688189 return this.Entities.Find(id); } /// /// Ö´ÐÐSQLÓï¾ä /// /// public virtual int ExecuteSqlCommand(string sql) { return this._context.ExecuteSqlCommand(sql); } /// /// Insert entity /// /// Entity public virtual void Insert(T entity) { try { if (entity == null) throw new ArgumentNullException("entity"); this.Entities.Add(entity); this._context.SaveChanges(); } catch (DbEntityValidationException dbEx) { var msg = string.Empty; foreach (var validationErrors in dbEx.EntityValidationErrors) foreach (var validationError in validationErrors.ValidationErrors) msg += string.Format("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage) + Environment.NewLine; var fail = new Exception(msg, dbEx); throw fail; } } /// /// Insert entities /// /// Entities public virtual void Insert(IEnumerable entities) { try { if (entities == null) throw new ArgumentNullException("entities"); foreach (var entity in entities) this.Entities.Add(entity); this._context.SaveChanges(); } catch (DbEntityValidationException dbEx) { var msg = string.Empty; foreach (var validationErrors in dbEx.EntityValidationErrors) foreach (var validationError in validationErrors.ValidationErrors) msg += string.Format("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage) + Environment.NewLine; var fail = new Exception(msg, dbEx); throw fail; } } /// /// Update entity /// /// Entity public virtual void Update(T entity) { try { if (entity == null) throw new ArgumentNullException("entity"); int ret = this._context.SaveChanges(); BatchService.Framework.Utility.LogHelper.Info("¸üвÙ×÷Ö´Ðнá¹û:" + ret + ",Id:" + entity.Id); } catch (DbEntityValidationException dbEx) { var msg = string.Empty; foreach (var validationErrors in dbEx.EntityValidationErrors) foreach (var validationError in validationErrors.ValidationErrors) msg += Environment.NewLine + string.Format("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage); var fail = new Exception(msg, dbEx); throw fail; } } /// /// Update entities /// /// Entities public virtual void Update(IEnumerable entities) { try { if (entities == null) throw new ArgumentNullException("entities"); this._context.SaveChanges(); } catch (DbEntityValidationException dbEx) { var msg = string.Empty; foreach (var validationErrors in dbEx.EntityValidationErrors) foreach (var validationError in validationErrors.ValidationErrors) msg += string.Format("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage) + Environment.NewLine; var fail = new Exception(msg, dbEx); throw fail; } } /// /// Delete entity /// /// Entity public virtual void Delete(T entity) { try { if (entity == null) throw new ArgumentNullException("entity"); this.Entities.Remove(entity); this._context.SaveChanges(); } catch (DbEntityValidationException dbEx) { var msg = string.Empty; foreach (var validationErrors in dbEx.EntityValidationErrors) foreach (var validationError in validationErrors.ValidationErrors) msg += Environment.NewLine + string.Format("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage); var fail = new Exception(msg, dbEx); throw fail; } } /// /// Delete entities /// /// Entities public virtual void Delete(IEnumerable entities) { try { if (entities == null) throw new ArgumentNullException("entities"); foreach (var entity in entities) this.Entities.Remove(entity); this._context.SaveChanges(); } catch (DbEntityValidationException dbEx) { var msg = string.Empty; foreach (var validationErrors in dbEx.EntityValidationErrors) foreach (var validationError in validationErrors.ValidationErrors) msg += Environment.NewLine + string.Format("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage); var fail = new Exception(msg, dbEx); throw fail; } } #endregion #region Properties /// /// Gets a table /// public virtual IQueryable Table { get { return this.Entities; } } /// /// Gets a table with "no tracking" enabled (EF feature) Use it only when you load record(s) only for read-only operations /// public virtual IQueryable TableNoTracking { get { return this.Entities.AsNoTracking(); } } /// /// Entities /// protected virtual IDbSet Entities { get { if (_entities == null) _entities = _context.Set(); return _entities; } } #endregion } }