在之前的文章里,业务层直接调用一个包装的仓储类入口,忽略了DAL层,在业务层绕过DAL直接调用仓储类似乎也没什么大的问题,但是这样做有一个很大的弊端,就是无法做到DAL层的原子操作的复用。假如多个业务对象调用一个原子操作,每次都要通过仓储类重写,造成了代码的冗余,因此DAL层还是需要的,另外就是业务层可以采用UnitOfWork的思想去扩展,这样业务层可以共用一个数据上下文,从而保证了事务。

所以大致优化了架构。

仓储类改成泛型的结构

 public class BaseRepository<TEntity> : IRepository, IDisposable where TEntity : class
{
private MyDbContext dbContext; public MyDbContext DbContext
{
get
{
return dbContext;
}
set
{
dbContext = value;
}
} private bool disposed; public BaseRepository()
{
dbContext = DbContextFactory.GetCurrentDbContext<QDbContext>();
} public BaseRepository(DbSource db)
{
dbContext = DbContextFactory.GetCurrentDbContext(db);
} public BaseRepository(MyDbContext _dbContext)
{
this.dbContext = _dbContext; } #region 增删改查 /// <summary>
/// 新增实体对象
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <param name="model"></param>
/// <returns></returns>
public int Insert(TEntity model)
{
return this.ChangeObjectState(model, EntityState.Added);
} /// <summary>
/// 新增实体对象集合
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <param name="models"></param>
/// <returns></returns>
public int Insert(IEnumerable<TEntity> models)
{
return this.ChangeObjectState(models, EntityState.Added);
} /// <summary>
/// 持久化对象更改
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <param name="model"></param>
/// <returns></returns>
public int Update(TEntity model)
{
return this.ChangeObjectState(model, EntityState.Modified);
} /// <summary>
/// 更新对象集合
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <param name="models"></param>
/// <returns></returns>
public int Update(IEnumerable<TEntity> models)
{
return this.ChangeObjectState(models, EntityState.Modified);
} /// <summary>
/// 更新对象部分属性
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <param name="predicate"></param>
/// <param name="updateAction"></param>
/// <returns></returns>
public int Update(Expression<Func<TEntity, bool>> predicate, Action<TEntity> updateAction)
{
if (predicate == null)
throw new ArgumentNullException("predicate");
if (updateAction == null)
throw new ArgumentNullException("updateAction"); //dbContext.Configuration.AutoDetectChangesEnabled = true;
var _model = dbContext.Set<TEntity>().Where(predicate).ToList();
if (_model == null) return ;
_model.ForEach(p =>
{
updateAction(p);
dbContext.Entry<TEntity>(p).State = EntityState.Modified;
});
return Save();
} /// <summary>
/// 删除实体对象
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <param name="model"></param>
/// <returns></returns>
public int Delete(TEntity model)
{
return this.ChangeObjectState(model, EntityState.Deleted);
} /// <summary>
/// 删除实体对象集合
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <param name="models"></param>
/// <returns></returns>
public int Delete(IEnumerable<TEntity> models)
{
return this.ChangeObjectState(models, EntityState.Deleted);
} /// <summary>
/// 删除实体对象集合(符合部分条件的)
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <param name="predicate"></param>
/// <returns></returns>
public int Delete(Expression<Func<TEntity, bool>> predicate)
{
List<TEntity> _list = null; _list = dbContext.Set<TEntity>().Where(predicate).ToList();
foreach (var item in _list)
{
dbContext.Entry<TEntity>(item).State = EntityState.Deleted;
}
return Save();
} /// <summary>
/// 查询单个记录
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <param name="predicate"></param>
/// <returns></returns>
public TEntity GetFirstOrDefault(Expression<Func<TEntity, bool>> predicate = null)
{
if (predicate == null)
{
return dbContext.Set<TEntity>().FirstOrDefault();
}
else
{
return dbContext.Set<TEntity>().Where(predicate).FirstOrDefault();
} } /// <summary>
/// 查询多笔记录
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <param name="predicate"></param>
/// <returns></returns>
public IList<TEntity> GetList(Expression<Func<TEntity, bool>> predicate = null)
{ if (predicate == null)
{
return dbContext.Set<TEntity>().ToList();
}
else
{
return dbContext.Set<TEntity>().Where(predicate).ToList();
}
} public IList<TEntity> GetPaged(out int total, Expression<Func<TEntity, bool>> filter = null, Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null, int index = , int size = )
{
int skipCount = (index - ) * size;
var query = Get(filter, orderBy);
total = query.Count();
query = skipCount > ? query.Skip(skipCount).Take(size) : query.Take(size);
return query.ToList();
} public IList<TEntity> GetPaged(out int total, Expression<Func<TEntity, bool>> filter = null, string orderBy = null, int index = , int size = )
{
int skipCount = (index - ) * size;
var query = Get(filter, orderBy);
total = query.Count();
query = skipCount > ? query.Skip(skipCount).Take(size) : query.Take(size);
return query.ToList();
} /// <summary>
/// 用作条件查询使用
/// </summary>
/// <returns></returns>
public IQueryable<TEntity> GetQueryable()
{
IQueryable<TEntity> query = dbContext.Set<TEntity>();
return query;
} /// <summary>
/// 执行带参数的sql语句,返回List
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="strsql"></param>
/// <param name="paras"></param>
/// <returns></returns>
public IEnumerable<TEntity> GetList(string strsql, SqlParameter[] paras)
{
return dbContext.Database.SqlQuery<TEntity>(strsql, paras).ToList();
} /// <summary>
/// 执行不带参数的sql语句,返回list
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="strsql"></param>
/// <returns></returns>
public IEnumerable<TEntity> GetList(string strsql)
{
return dbContext.Database.SqlQuery<TEntity>(strsql).ToList();
} /// <summary>
/// 执行带参数的sql语句,返回一个对象
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="strsql"></param>
/// <param name="paras"></param>
/// <returns></returns>
public TEntity GetOneEntity(string strsql, SqlParameter[] paras)
{
return dbContext.Database.SqlQuery<TEntity>(strsql, paras).Cast<TEntity>().First();
} /// <summary>
/// 执行不带参数的sql语句,返回一个对象
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="strsql"></param>
/// <returns></returns>
public TEntity GetOneEntity(string strsql)
{
return dbContext.Database.SqlQuery<TEntity>(strsql).Cast<TEntity>().First();
} /// <summary>
/// 执行带参数的sql语句,返回List
/// </summary>
/// <typeparam name="TView"></typeparam>
/// <param name="strsql"></param>
/// <param name="paras"></param>
/// <returns></returns>
public IEnumerable<TView> GetList<TView>(string strsql, SqlParameter[] paras)
{
return dbContext.Database.SqlQuery<TView>(strsql, paras).ToList();
} /// <summary>
/// 执行不带参数的sql语句,返回list
/// </summary>
/// <typeparam name="TView"></typeparam>
/// <param name="strsql"></param>
/// <returns></returns>
public IEnumerable<TView> GetList<TView>(string strsql)
{
return dbContext.Database.SqlQuery<TView>(strsql).ToList();
} /// <summary>
/// 执行带参数的sql语句,返回一个对象
/// </summary>
/// <typeparam name="TView"></typeparam>
/// <param name="strsql"></param>
/// <param name="paras"></param>
/// <returns></returns>
public TView GetOneEntity<TView>(string strsql, SqlParameter[] paras)
{
return dbContext.Database.SqlQuery<TView>(strsql, paras).Cast<TView>().First();
} /// <summary>
/// 执行不带参数的sql语句,返回一个对象
/// </summary>
/// <typeparam name="TView"></typeparam>
/// <param name="strsql"></param>
/// <returns></returns>
public TView GetOneEntity<TView>(string strsql)
{
return dbContext.Database.SqlQuery<TView>(strsql).Cast<TView>().First();
} /// <summary>
/// 获取查询数量
/// </summary>
/// <param name="sql"></param>
/// <param name="paras"></param>
/// <returns></returns>
public int GetCount(string sql, SqlParameter[] paras)
{
return dbContext.Database.SqlQuery(typeof(int), sql, paras).Cast<int>().First();
} #endregion #region 私有方法 private int Save()
{
int effect = ;
if (!this.dbContext.IsTransaction)
{
effect = this.dbContext.SaveChanges();
}
return effect;
} /// <summary>
/// 变更上下文管理器(对象)
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <param name="model"></param>
/// <param name="state"></param>
private int ChangeObjectState(TEntity model, EntityState state)
{
//_context.Configuration.ValidateOnSaveEnabled = false;
dbContext.Entry<TEntity>(model).State = state;
return Save(); } /// <summary>
/// 变更上下文管理器(对象集合)
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <param name="model"></param>
/// <param name="state"></param>
private int ChangeObjectState(IEnumerable<TEntity> model, EntityState state)
{
if (model == null) return ; //_context.Configuration.AutoDetectChangesEnabled = false;
model.ToList().ForEach(p => dbContext.Entry<TEntity>(p).State = state);
return Save(); } private IQueryable<TEntity> Get(Expression<Func<TEntity, bool>> filter = null, string orderBy = null)
{
IQueryable<TEntity> query = dbContext.Set<TEntity>();
if (filter != null)
{
query = query.Where(filter);
}
if (!string.IsNullOrEmpty(orderBy))
{
query = query.OrderBy(orderBy);
}
return query.AsQueryable();
} private IQueryable<TEntity> Get(Expression<Func<TEntity, bool>> filter = null, Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null)
{
IQueryable<TEntity> query = dbContext.Set<TEntity>();
if (filter != null)
{
query = query.Where(filter);
}
if (orderBy != null)
{
orderBy(query).AsQueryable();
}
return query.AsQueryable();
} #endregion public int ExecuteSqlCommand(string sql, params SqlParameter[] paras)
{
if (this.dbContext.IsTransaction)
{
if (dbContext.Database.CurrentTransaction == null)
{
dbContext.Database.BeginTransaction();
}
}
return dbContext.Database.ExecuteSqlCommand(sql, paras);
} public void Dispose()
{
this.Dispose(true);
GC.SuppressFinalize(this);
} public virtual void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
this.dbContext.Dispose();
}
}
this.disposed = true;
}
}

单元仓储

 public class UserRepository : BaseRepository<S_Users>
{
public UserRepository():base()
{
}
public UserRepository(DbSource dbSource)
: base(dbSource)
{
}

业务层 继承基类 保证可以共用一个数据上下文

 public class BaseBiz
{
protected Lazy<MyDbContext> _QDbContext = null; protected MyDbContext QDbContext
{
get
{
return _QDbContext.Value;
}
} protected Lazy<MyDbContext> _XFDbContext = null; protected MyDbContext XFDbContext
{
get
{
return _XFDbContext.Value;
}
}
public BaseBiz()
{
_QDbContext = new Lazy<MyDbContext>(() => DbContextFactory.GetCurrentDbContext<QDbContext>());
_XFDbContext = new Lazy<MyDbContext>(() => DbContextFactory.GetCurrentDbContext<XFDbContext>());
}
 public class DbContextFactory
{ public static T GetCurrentDbContext<T>() where T : DbContext, new()
{
string name = typeof(T).Name;
T dbContext = CallContext.GetData(name) as T;
if (dbContext == null)
{
dbContext = new T();
CallContext.SetData(name, dbContext);
}
return dbContext;
}

具体的业务类

 public class S_Users_Cls : BaseBiz
{
protected UserRepository UserRepository = null; public S_Users_Cls()
{
//UserRepository = RepositoryFactory.CreateRepository<UserRepository>(this.QDbContext);
UserRepository = new UserRepository();
}

将事务包装在DbContext里

  public class MyDbContext : DbContext, ITransaction
{ public MyDbContext(string connectionString)
: base(connectionString)
{
// 是否启动延迟加载
Configuration.LazyLoadingEnabled = false;
// 是否启动代理
Configuration.ProxyCreationEnabled = false;
Configuration.AutoDetectChangesEnabled = false;
Configuration.ValidateOnSaveEnabled = false; } public void BeginTransaction()
{
if (this.Database.CurrentTransaction == null)
{
this.Database.BeginTransaction();
}
this.IsTransaction = true;
} public int Commit()
{
int reault = this.SaveChanges();
this.IsTransaction = false;
DbContextTransaction transaction = this.Database.CurrentTransaction;
if (transaction != null)
{
transaction.Commit();
transaction.Dispose();
reault += ;
}
return reault;
} public void Rollback()
{
this.IsTransaction = false;
DbContextTransaction transaction = this.Database.CurrentTransaction;
if (transaction != null)
{
transaction.Rollback();
transaction.Dispose();
}
} private bool isTransaction = false; public bool IsTransaction
{
get { return isTransaction; }
set { this.isTransaction = value; }
} }
public class XFDbContext : MyDbContext
{
public XFDbContext()
: base("XFJD")
{
// 防止Entity变更导致数据库自动更新
Database.SetInitializer<XFDbContext>(null);
}

最后看看业务层如何事务调用

   public bool Add(S_Users model)
{ bool result = false;
this.DbContext.BeginTransaction();
try
{
this.UserRepository.Insert(model); int effect = this.DbContext.Commit();
result = effect > ;
}
catch (Exception ex)
{
this.DbContext.Rollback();
}
return result;
}

非事务性操作

  public bool EditPwd(S_Users model)
{
return UserRepository.EditPwd(model);
}

最后,结构优化用了时间比较短,不敢保证代码是否会存在一些问题。

可以根据是否需要单元仓储类来灵活搭配

Entity Framework 第八篇 结构优化的更多相关文章

  1. Entity Framework 学习中级篇1—EF支持复杂类型的实现

    本节,将介绍如何手动构造复杂类型(ComplexType)以及复杂类型的简单操作. 通常,复杂类型是指那些由几个简单的类型组合而成的类型.比如:一张Customer表,其中有FristName和Las ...

  2. Entity Framework学习初级篇2

    Entity Framework 学习初级篇2--ObjectContext.ObjectQuery.ObjectStateEntry.ObjectStateManager类的介绍 本节,简单的介绍E ...

  3. entity framework 新手入门篇(1)-建立模型

    entity framework是微软官方免费提供给大家的一套ORM(Object Relational Mapping对象关系映射)解决方案.它不仅可以帮助我们解决数据缓存的问题,还能在最小的开销下 ...

  4. [2014-09-18]Entity Framework 6 预热、启动优化

    好久没写博客了,终于憋出了一个大招,现在总结下. 虽然文章题目是针对EF的,但涉及的内容不仅仅是EF. 场景介绍 目前在做的一个项目,行业门户,项目部分站点按域名划分如下: user.xxx.com: ...

  5. Entity Framework 6 预热、启动优化

    虽然文章题目是针对EF的,但涉及的内容不仅仅是EF. 场景介绍 目前在做的一个项目,行业门户,项目部分站点按域名划分如下: user.xxx.com:用户登陆注册 owner.xxx.com:个人用户 ...

  6. entity framework 新手入门篇(3)-entity framework实现orderby,count,groupby,like,in,分页等

    前面我们已经学习了entityframework的基本的增删改查,今天,我们将在EF中实现一些更加贴近于实际功能的SQL方法. 承接上面的部分,我们有一个叫做House的数据库,其中包含house表和 ...

  7. entity framework 新手入门篇(2)-entity framework基本的增删改查

    经过前两节的简单描述,终于可以进入entity framework的使用部分了.本节将对entity framework原生的增删改查进行讲解. 承接上面的部分,我们有一个叫做House的数据库,其中 ...

  8. Entity Framework 第三篇 实体特性声明

    Entity Framework中对实体的特性声明有着严格的要求 1.实体必须要有主键特性,但是如果实体没有主键特性那怎么办? public int ExecuteSqlCommand(string ...

  9. Entity Framework 学习初级篇1--EF基本概况

    转自:http://www.cnblogs.com/Tally/archive/2012/09/14/2685011.html 最近在学习研究微软的EF,通过这时间的学习研究,感觉这个EF目前来说还不 ...

随机推荐

  1. Git分布式项目管理 入门到学会

    Git简介 Git是什么? Git和SVN一样都是一种高效的管理代码的系统. Git是目前世界上最先进的分布式版本控制系统(没有之一). 创建版本库 什么是版本库呢?版本库又名仓库,英文名reposi ...

  2. SSH环境 jsp url跳转,带中文参数乱码问题

    URL中编码格式为ISO-8859-1,处理中文只需将编码格式转换ISO-8859-1 方法一: http://xxx.do?ptname='我是中国人' String strPtname = req ...

  3. nyoj-71

    描述 进行一次独木舟的旅行活动,独木舟可以在港口租到,并且之间没有区别.一条独木舟最多只能乘坐两个人,且乘客的总重量不能超过独木舟的最大承载量.我们要尽量减少这次活动中的花销,所以要找出可以安置所有旅 ...

  4. JAVA面向对象程序设计——实验报告

  5. Android课程---布局管理器中的线性布局

    线性布局实例: <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:andro ...

  6. C# Math

    Math.Ceiling 向上进位取整.例如:Math.Ceiling(32.6)=33; Math.Ceiling(32.0)=32; Math.Floor 向下舍位取整.例如:Math.Floor ...

  7. UrlRewriteFilter

    UrlRewriteFilter是一个改写URL的Java Web过滤器,可见将动态URL静态化.适用于任何Java Web服务器(Resin,Jetty,JBoss,Tomcat,Orion等).与 ...

  8. 使用safe-rm替代rm

    safe-rm主页: https://launchpad.net/safe-rm 一.下载safe-rm 二.解压文件,拷贝safe-rm到/usr/local/bin/目录下 三.建立软连接: #l ...

  9. Android如何连接MySQL数据库

    Android开发中,大多数连接到远程MySQL数据库的方法是加入特定的Service到代码中.由于MySQL通常是和PHP一起使用的,最简单以及最常见的方法是写PHP脚本管理数据连接,以及从Andr ...

  10. Wordpress去除管理员工具条

    想去掉这条东西有多种方式,个人比较喜欢这个,灵活~ 打开用户,在用户选项里,把这个勾走.