using System; using System.Collections.Generic; using System.Data.Entity; using System.Data.Entity.Validation; using System.Data.SqlClient; using System.Linq; using System.Linq.Expressions; using WX.CRM.Common; using WX.CRM.Model.Entity; namespace WX.CRM.BLL { public class DbContextRepository : IRepository where T : class { public virtual T Get(Expression> where) { using (var db = new crmContext()) { return db.Set().FirstOrDefault(where); } } public virtual int Add(T entity) { if (entity == null) throw new ArgumentNullException("entity"); using (var db = new crmContext()) { try { db.Set().Add(entity); return db.SaveChanges(); } catch (DbEntityValidationException exception) { var errorMessages = exception.EntityValidationErrors .SelectMany(validationResult => validationResult.ValidationErrors) .Select(m => m.ErrorMessage); var fullErrorMessage = string.Join(", ", errorMessages); //记录日志 //Log.Error(fullErrorMessage); var exceptionMessage = string.Concat(exception.Message, " 验证异常消息是:", fullErrorMessage); LogHelper.Error(exceptionMessage); throw new DbEntityValidationException(exceptionMessage, exception.EntityValidationErrors); } catch (Exception ex) { throw ex; } } } public virtual void AddList(List list) { if (list == null) throw new ArgumentNullException("entity"); using (var db = new crmContext()) { var _dbSet = db.Set(); foreach (var item in list) { _dbSet.Add(item); } db.SaveChanges(); } } public virtual bool Update(T obj) { using (var db = new crmContext()) { var entry = db.Entry(obj); db.Set().Attach(obj); entry.State = EntityState.Modified; return db.SaveChanges() > 0; } } public virtual void Delete(T obj) { using (var db = new crmContext()) { var entry = db.Entry(obj); entry.State = EntityState.Deleted; db.Set().Remove(obj); db.SaveChanges(); } } public virtual bool Delete(Expression> where) { using (var db = new crmContext()) { var result = db.Set().RemoveRange(db.Set().Where(where)).Count() > 0; db.SaveChanges(); return result; } } public virtual IEnumerable GetList() { return GetList(null); } public virtual IEnumerable GetList(Expression> where) { using (var db = new crmContext()) { Debug(db); if (where != null) { return db.Set().Where(where).ToList(); } return db.Set().ToList(); } } public virtual IEnumerable GetList(Expression> where, Expression> orderBy = null, SortOrder sortOrder = SortOrder.Descending) { using (var db = new crmContext()) { Debug(db); if (orderBy == null) { return db.Set().Where(where).ToList(); } else { if (sortOrder == SortOrder.Descending) return db.Set().Where(where).OrderByDescending(orderBy).ToList(); else return db.Set().Where(where).OrderBy(orderBy).ToList(); } } } public IEnumerable GetList(Expression> orderBy, int pageindex, int pagesize, out int totalRecords, SortOrder sortOrder = SortOrder.Descending) { return GetList(null, orderBy, pageindex, pagesize, out totalRecords, sortOrder); } public IEnumerable GetList(Expression> where, Expression> orderBy, Pager pg, SortOrder sortOrder = SortOrder.Descending) { int totalRecords; var list = GetList(where, orderBy, pg.page, pg.rows, out totalRecords, sortOrder); pg.totalRows = totalRecords; return list; } public IEnumerable GetList(Expression> where, Expression> orderBy, int pageindex, int pagesize, out int totalRecords, SortOrder sortOrder = SortOrder.Descending) { using (var db = new crmContext()) { Debug(db); if (pageindex < 1) throw new ArgumentException("pageindex"); if (pagesize < 1) throw new ArgumentException("pagesize"); int skip = (pageindex - 1) * pagesize; var _query = db.Set().AsQueryable(); if (null != where) _query = _query.Where(where); totalRecords = _query.Count(); if (sortOrder == SortOrder.Descending) { _query = _query.OrderByDescending(orderBy); } else _query = _query.OrderBy(orderBy); return _query.Skip(skip).Take(pagesize).ToList(); } } public bool Exists(Expression> where) { using (var db = new crmContext()) { return db.Set().Any(where); } } public void Dispose() { //if (db != null) // db.Dispose(); } bool isDebug = true; private void Debug(crmContext db) { //if (isDebug) // db.Database.Log = s => System.Diagnostics.Debug.WriteLine(s); //if (isDebug) // db.Database.Log = s => LogHelper.Debug(s); } } public interface IRepository : IDisposable where T : class { T Get(Expression> where); IEnumerable GetList(); IEnumerable GetList(Expression> where); IEnumerable GetList(Expression> where, Expression> orderBy = null, SortOrder sortOrder = SortOrder.Descending); IEnumerable GetList(Expression> orderBy, int pageindex, int pagesize, out int totalRecords , SortOrder sortOrder = SortOrder.Descending); IEnumerable GetList(Expression> where, Expression> orderBy, int pageindex, int pagesize, out int totalRecords, SortOrder sortOrder = SortOrder.Descending); IEnumerable GetList(Expression> where, Expression> orderBy, Pager pg, SortOrder sortOrder = SortOrder.Descending); int Add(T entity); void AddList(List list); bool Update(T obj); void Delete(T obj); bool Delete(Expression> where); bool Exists(Expression> where); } }