【发布时间】:2017-09-07 08:47:50
【问题描述】:
我有一个 get 方法,在该方法中我对要返回的对象的一些数组属性进行一些过滤:
public async Task<WorkflowStepDto> GetCurrentWorkflowStep(string entity, string status, string clientId = null)
{
var workflowStep = await _workflowStepRepository.GetAll().Include("WorkflowEntity")
.Include("WorkflowStepActions").Include("WorkflowStepConfigurations")
.FirstOrDefaultAsync(s => s.Name == status && s.WorkflowEntity.Name == entity);
var workflowRoles = User.Claims.Where(c => c.Type == "workflowRole").Select(c => c.Value).ToArray();
workflowStep.WorkflowStepActions =
workflowStep.WorkflowStepActions
.Where(s => (workflowRoles.Contains(s.WorkflowRole) ||
(workflowRoles.Length == 0 && string.IsNullOrEmpty(s.WorkflowRole)) ||
s.WorkflowRole == "*")).OrderBy(a => a.Priority).ToList();
workflowStep.WorkflowStepConfigurations = workflowStep.WorkflowStepConfigurations
.Where(c => workflowRoles.Contains(c.WorkflowStepRoleId) ||
(workflowRoles.Length == 0 && string.IsNullOrEmpty(c.WorkflowStepRoleId)))
.OrderBy(c => c.Priority).Take(1).ToList();
return workflowStep.MapTo<WorkflowStepDto>();
}
例如属性WorkflowStepActions 需要被过滤掉以仅显示用户有权访问的操作,WorkflowStepConfigurations 也是如此。
问题在于UnitOfWork 模式。尽管这是一个GET 方法并且我不想保存任何数据,但在方法结束时,UnitOfWork 会将更改保存到数据库,删除当前调用中已过滤掉的WorkflowStepActions。
我尝试使用 [UnitOfWork(IsDisabled=false)] 一起禁用 UnitOfWork,但随后我收到一条错误消息,指出无法访问存储库,因为它已被释放。
有什么方法可以AcceptChanges 到 UnitOfWork,或者让它自动停止保存更改?
【问题讨论】:
-
尝试 Configuration.UnitOfWork.Scope = TransactionScopeOption.Suppress;
-
如果你想让你自己的实体的私有副本发生变异,穷人的解决方案可能是把
AsNoTracking扔在那里。
标签: c# asp.net-core aspnetboilerplate