簡體   English   中英

如何防止UnitOfWork將更改保存在ASP.NET Boilerplate中

[英]How to prevent UnitOfWork from saving changes in ASP.NET Boilerplate

我有一個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,或使其停止自動保存更改?

使用此方法的位置(在appservice,domainservice,自定義類等中)非常重要。

假設您在域服務中使用它

您必須向方法添加[UnitOfWork]屬性,並使方法虛擬。

        [UnitOfWork] 
        public virtual async Task<WorkflowStepDto> GetCurrentWorkflowStep(string entity, string status, string clientId = null)
        {

        }

如果您要以異步方式手動保存更改。 您可以在任何應用程序服務中使用以下代碼。

 await CurrentUnitOfWork.SaveChangesAsync();

如果要開始一個新的工作單元,可以使用此

//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();
    }
}

要獲取更多信息,請閱讀文檔-> https://aspnetboilerplate.com/Pages/Documents/工作單元

嘗試這種解決方法,但是在這種情況下, GetCurrentWorkflowStep應該是獨立的,即不要被另一個代碼隱式調用:

public IUnitOfWorkManager _unitOfWorkManager {get; set;}

[UnitOfWork(IsDisabled = true)]
public async Task<WorkflowStepDto> GetCurrentWorkflowStep(...)
{
    using (var unitOfWork = _unitOfWorkManager.Begin())
    {
        //your code....
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM