标签: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