C# 如何防止UnitOfWork在ASP.NET样板文件中保存更改

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

我有一个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>();
    }
公共异步任务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();
    }
}