Repository+UnitWork

 

 谈到MVC与EntityFramework,则不得不说一说事务与仓储(Unit of work + Repository)。

  仓储(Repository):领域对象集合。用于操作领域对象与数据库上下文(DbContext)的交互(在此不得不说一声,领域对象和数据库表对象还是有区别的。领域对象实际上是一组有业务关系的数据库对象的抽象。最简单的形式就是主表、关系表在同一个领域对象中进行定义。例如我们前几章看到的UserProfile,它即定义了用户信息,又定义了用户角色关系信息)。

  事务(Transaction):多个业务处理有必然的顺序性、依赖性,则默认这些业务为一个原子操作。在这里我们使用工作单元,即Unit of work模式,来维护事务的原子性。

  首先,先让我们构建仓储接口。为了更好的使用EntityFramework的延迟加载,所有查询集合的接口我们均使用IQueryable接口类型作为返回值。

 

 

 

/// <summary>
/// 删除满足表达式的记录
 /// </summary>
 /// <param name="predicate">过滤条件表达式</param>
/// <param name="submitImmediately">是否直接提交。默认false。</param>
  public void Delete(Expression<Func<T, bool>> predicate, bool submitImmediately = false)
   {
         try
        {
            Context.Configuration.AutoDetectChangesEnabled = false; //关闭数据库上下文的自动更新跟踪功能,可提高批量操作的性能

                var objects = Filter(predicate);
                 foreach (var obj in objects)
                     DbSet.Remove(obj);
                 if (submitImmediately)
                     Context.SaveChanges();
             }
             finally
             {
                Context.Configuration.AutoDetectChangesEnabled = true; //完成批量操作后,打开数据库上下文的自动更新跟踪功能
            }
        }
}

 

posted @ 2018-03-22 15:47  接管人生  阅读(329)  评论(0)    收藏  举报