C# 如何防止UnitOfWork在ASP.NET样板文件中保存更改
我有一个get方法,在该方法中,我对要返回的对象的一些数组属性进行过滤:C# 如何防止UnitOfWork在ASP.NET样板文件中保存更改,c#,asp.net-core,aspnetboilerplate,C#,Asp.net Core,Aspnetboilerplate,我有一个get方法,在该方法中,我对要返回的对象的一些数组属性进行过滤: public async Task<WorkflowStepDto> GetCurrentWorkflowStep(string entity, string status, string clientId = null) { var workflowStep = await _workflowStepRepository.GetAll().Include("WorkflowEn
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>();
}
公共异步任务GetCurrentWorkflowStep(字符串实体、字符串状态、字符串clientId=null)
{
var workflowStep=await_workflowstepsrepository.GetAll().Include(“WorkflowEntity”)
.Include(“工作流步骤动作”).Include(“工作流步骤配置”)
.FirstOrDefaultAsync(s=>s.Name==status&&s.WorkflowEntity.Name==entity);
var workflowRoles=User.Claims.Where(c=>c.Type==“workflowRole”)。选择(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();
返回workflowStep.MapTo();
}
例如,需要过滤掉属性WorkflowStepActions
,以仅显示用户有权访问的操作,WorkflowStepConfigurations
也是如此
问题在于UnitOfWork
模式。尽管这是一个GET
方法,我不想保存任何数据,但在该方法结束时,UnitOfWork会将更改保存到数据库,删除在当前调用中过滤掉的WorkflowStepActions
我尝试使用[UnitOfWork(IsDisabled=false)]
一起禁用UnitOfWork,但随后出现一个错误,表示无法访问存储库,因为它已被释放
是否有任何方法可以
接受对UnitOfWork的更改
,或使其自动停止保存更改?尝试此解决方法,但在这种情况下,GetCurrentWorkflowStep
应该是独立的,即不被另一个代码隐式调用:
public IUnitOfWorkManager _unitOfWorkManager {get; set;}
[UnitOfWork(IsDisabled = true)]
public async Task<WorkflowStepDto> GetCurrentWorkflowStep(...)
{
using (var unitOfWork = _unitOfWorkManager.Begin())
{
//your code....
}
}
public IUnitOfWorkManager\u unitOfWorkManager{get;set;}
[工作单元(IsDisabled=true)]
公共异步任务GetCurrentWorkflowStep(…)
{
使用(var unitOfWork=\u unitOfWorkManager.Begin())
{
//你的代码。。。。
}
}
使用此方法的位置很重要(在appservice、domainservice、自定义类等中)
假设您在域服务中使用它
您必须向方法添加[UnitOfWork]属性,并使该方法成为虚拟的
[UnitOfWork]
public virtual async Task<WorkflowStepDto> GetCurrentWorkflowStep(string entity, string status, string clientId = null)
{
}
如果你想开始一个新的工作单元,你可以使用这个
//inject IUnitOfWorkManager to your class in constructor method.
private readonly IUnitOfWorkManager _unitOfWorkManager;
public async Task<WorkflowStepDto> GetCurrentWorkflowStep(...)
{
using (var uow = _unitOfWorkManager.Begin(TransactionScopeOption.RequiresNew))
{
//You can save changes in any step of code to get some new inserted record's id... This is not required if you don't have such insertions.
await _unitOfWorkManager.Current.SaveChangesAsync();
//You have to apply Complete method in the end.
await uow.CompleteAsync();
}
}
//在构造函数方法中将IUnitOfWorkManager注入到类中。
私人只读IUnitOfWorkManager\u unitOfWorkManager;
公共异步任务GetCurrentWorkflowStep(…)
{
使用(var uow=\u unitOfWorkManager.Begin(TransactionScopeOption.RequiresNew))
{
//您可以在代码的任何步骤中保存更改以获取一些新插入的记录的id。如果您没有此类插入,则不需要这样做。
wait_unitOfWorkManager.Current.SaveChangesAsync();
//最后你必须应用完整的方法。
等待uow.CompleteAsync();
}
}
要获得更多信息,请阅读文档->请解释技术工作流存储库使用的内容。我假设EFtry Configuration.UnitOfWork.Scope=TransactionScopeOption.Suppress;一个穷人的解决方案可能是,如果你想让你自己的实体的私有副本发生变异,就在那里抛出
AsNoTracking
。@Carol这个问题解决了吗?@Carol这个问题解决了吗?
//inject IUnitOfWorkManager to your class in constructor method.
private readonly IUnitOfWorkManager _unitOfWorkManager;
public async Task<WorkflowStepDto> GetCurrentWorkflowStep(...)
{
using (var uow = _unitOfWorkManager.Begin(TransactionScopeOption.RequiresNew))
{
//You can save changes in any step of code to get some new inserted record's id... This is not required if you don't have such insertions.
await _unitOfWorkManager.Current.SaveChangesAsync();
//You have to apply Complete method in the end.
await uow.CompleteAsync();
}
}