今天看啥  ›  专栏  ›  寻找无名的特质

ABP 中的Unit Of Work使用一例

寻找无名的特质  · 简书  ·  · 2019-08-18 08:01

在EF中,如果我们定义了一对多关系如下:

namespace jiagoushi_cn.MyFlow.Core
{
    public class ProcessModel:Entity
    {
        public virtual string ProcessModelGuid { get; set; }

        public virtual string ProcessName { get; set; }

        public virtual string ProcessDescription { get; set; }
               
        public virtual ICollection<StateNode> StateNodes { get; set; }

        public virtual ICollection<StateTransfer> StateTransfers { get; set; }

        public virtual ICollection<ProcessVariable> Viriables { get; set; }
    }
}

那么如果我们使用DbContext获取一个ProcessModel的一个实例后,可以自动获取它相应的子实体的集合,比如:

            await UsingDbContextAsync(async context =>
            {
                var proc = await context.ProcessModels.FirstOrDefaultAsync(u => u.Id == process.Id);
                 proc.StateNodes.Count.ShouldBe(1);
            });

可是,如果在ABP中,如果我们使用IRepository获取ProcessModel的实例,如果访问它的子实体集合就会出错,比如下面的代码会出错:

   var model = _processRepository.Get(modelId);
    var lst=model.StateNodes.ToList();

这是因为IRepository的方法被作为工作单元处理,这个方法执行完,DbContext就会关闭,这时,如果再访问通过Respository获取的对象的子实体集合,就会出现错误。解决的办法是,将获取实例的代码和获取子实体集合的代码包括在相同的工作单元中,以避免DbContext被关闭,示例代码如下:

using (var uow = unf.Begin())
            {
                try
                {
                     var model = _processRepository.Get(modelId);
                     var lst=model.StateNodes.ToList();
                }
                finally
                {
                    uow.Complete();
                };
            }

这里,unf是 IUnitOfWorkManager,可以通过依赖注入获取。




原文地址:访问原文地址
快照地址: 访问文章快照