UnitOfWorkContextBase.cs
/* ============================================================================== * 功能描述:UnitOfWorkContextBase * 创 建 者:蒲奎民 * 创建日期:2016-08-29 10:59:20 * CLR Version :4.0.30319.42000 * ==============================================================================*/ using System; using System.Collections.Generic; using System.Data; using System.Data.Entity; using System.Data.Entity.Infrastructure; using System.Data.Entity.Validation; using System.Data.SqlClient; using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; namespace InjectExample.Component { /// <summary> /// 单元操作实现基类 /// </summary> public abstract class UnitOfWorkContextBase : IUnitOfWorkContext { /// <summary> /// 获取 当前使用的数据访问上下文对象 /// </summary> protected abstract DbContext Context { get; } /// <summary> /// 获取 当前单元操作是否已被提交 /// </summary> public bool IsCommitted { get; private set; } public DbContext DbContext { get { return Context; } } /// <summary> /// 提交当前单元操作的结果 /// </summary> /// <param name="validateOnSaveEnabled">保存时是否自动验证跟踪实体</param> /// <returns></returns> public int Commit(bool validateOnSaveEnabled = false) { //validateOnSaveEnabled=true时莫名其妙报错,暂时去掉 validateOnSaveEnabled = false; if (IsCommitted) { return 0; } try { int result = Context.SaveChanges(validateOnSaveEnabled); IsCommitted = true; return result; } catch (DbEntityValidationException ex) { var entry = ex.EntityValidationErrors.First().Entry; var err = ex.EntityValidationErrors.First().ValidationErrors.First(); var msg = err.ErrorMessage; try { var displayName = entry.Entity.GetType().GetProperty(err.PropertyName).GetPropertyDisplayName(); msg = string.Format(msg, displayName, entry.CurrentValues.GetValue<object>(err.PropertyName)); } catch (Exception) { } throw new Exception(msg); } catch (DbUpdateException e) { if (e.InnerException != null && e.InnerException.InnerException is SqlException) { var sqlEx = e.InnerException.InnerException as SqlException; //string msg = DataHelper.GetSqlExceptionMessage(sqlEx.Number); throw sqlEx; //PublicHelper.ThrowDataAccessException("提交数据更新时发生异常:" + msg, sqlEx); } throw; } } /// <summary> /// 把当前单元操作标记成未提交状态,发生错误时,不能回滚事务,不要调用! /// </summary> public void Rollback() { IsCommitted = false; } public void Dispose() { //if (!IsCommitted) //{ // Commit(); //} //if (Context != null) // Context.Dispose(); } /// <summary> /// 为指定的类型返回 System.Data.Entity.DbSet,这将允许对上下文中的给定实体执行 CRUD 操作。 /// </summary> /// <typeparam name="TEntity"> 应为其返回一个集的实体类型。 </typeparam> /// <returns> 给定实体类型的 System.Data.Entity.DbSet 实例。 </returns> public DbSet<TEntity> Set<TEntity>() where TEntity : class// EntityBase<TKey> { return Context.Set<TEntity>(); } /// <summary> /// 注册一个新的对象到仓储上下文中 /// </summary> /// <typeparam name="TEntity"> 要注册的类型 </typeparam> /// <param name="entity"> 要注册的对象 </param> public void RegisterNew<TEntity>(TEntity entity) where TEntity : class// EntityBase<TKey> { EntityState state = Context.Entry(entity).State; if (state == EntityState.Detached) { Context.Entry(entity).State = EntityState.Added; } IsCommitted = false; } /// <summary> /// 批量注册多个新的对象到仓储上下文中 /// </summary> /// <typeparam name="TEntity"> 要注册的类型 </typeparam> /// <param name="entities"> 要注册的对象集合 </param> public void RegisterNew<TEntity>(IEnumerable<TEntity> entities) where TEntity : class// EntityBase<TKey> { try { Context.Configuration.AutoDetectChangesEnabled = false; foreach (TEntity entity in entities) { RegisterNew<TEntity>(entity); } } finally { Context.Configuration.AutoDetectChangesEnabled = true; } } public void RegisterModified<TEntity>(IEnumerable<TEntity> entities) where TEntity : class// EntityBase<TKey> { try { Context.Configuration.AutoDetectChangesEnabled = false; foreach (TEntity entity in entities) { EntityState state = Context.Entry(entity).State; if (state == EntityState.Detached) { Context.Entry(entity).State = EntityState.Modified; } IsCommitted = false; } } finally { Context.Configuration.AutoDetectChangesEnabled = true; &nbs