码迷,mamicode.com
首页 > 其他好文 > 详细

简单了解UnitOfWork

时间:2014-09-28 02:58:20      阅读:250      评论:0      收藏:0      [点我收藏+]

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

当程序发生异常时就可进行相应回滚。

不妥之处欢迎大家指正。

简单了解UnitOfWork

标签:blog   io   使用   ar   for   数据   div   art   问题   

原文地址:http://www.cnblogs.com/xiguain/p/3997543.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!