标签:blog io 使用 ar for 数据 div art 问题
UnitOfWork
Unit Of Work模式,即工作单元,它是一种数据访问模式。它是用来维护一个由已经被业务修改(如增加、删除和更新等)的业务对象组成的列表。它负责协调这些业务对象的持久化工作及并发问题。那它是怎么来维护的一系列业务对象组成的列表持久化工作的呢?通过事务。Unit Of Work模式会记录所有对象模型修改过的信息,在提交的时候,一次性修改,并把结果同步到数据库。 这个过程通常被封装在事务中。所以在DAL中采用Unit Of Work模式好处就在于能够确保数据的完整性,如果在持有一系列业务对象(同属于一个事务)的过程中出现问题,就可以将所有的修改回滚,以确保数据始终处于有效状态,不会出现脏数据。
实现UnitOfWork
当然实现UnitOfWork的方式有很多,但是最重要的一点是维持数据操作发生在同一个DbContext之中,
建立IUnitOfWork
public interface IUnitOfWork { void Commit(); void Rollback(); }
实现UnitOfWork
public class UnityOfWork : IUnitOfWork { private DbContext _context; public UnityOfWork(DbContext context) { if (null == context) { throw new ArgumentNullException("context"); } _context = context; } public void Commit() { this._context.SaveChanges(); } public void Rollback() { _context.ChangeTracker.Entries().ToList().ForEach( entity => entity.State = EntityState.Unchanged ); //回滚 } }
简单的通过一个类实现DbContext访问,当然也可通过Ioc方式实现:
public class ContextFactory { private static DbContext context; public static DbContext Get() { if (null == context) { context = new BlogEntities() as DbContext; } return context; } }
之后就可以使用对应的Commit和Rollback了:
public ResultCode DeleteBlog(int id) { try { _blogRep.DeleteBy(b => b.Id == id); _commentRep.DeleteBy(c => c.BlogId == id); _blogRep.Add(new Tb_Article()); unitOfWork.Commit(); return ResultCode.MSG_ARTICLE_DELETE_SUCCESS; } catch (Exception ex) { unitOfWork.Rollback(); throw ex; } }
当程序发生异常时就可进行相应回滚。
不妥之处欢迎大家指正。
标签:blog io 使用 ar for 数据 div art 问题
原文地址:http://www.cnblogs.com/xiguain/p/3997543.html