【问题标题】:How can I do that unitofwork in actionfilter shouldnt save objects is changed in action如何在 actionfilter 中执行 unitofwork 不应该保存对象被更改
【发布时间】:2020-04-09 17:22:18
【问题描述】:

我使用 unitofwork 模式,它的生命周期是范围。我的控制器中有很多如下方法。我带来对象更改属性并保存它,然后我最终在actionfilter运行后返回该对象并记录并保存它。我的问题是我在filter中调用的unitofwork。它还保存了用户对象正在行动中,我不能保存那个对象。我该如何解决这个问题

public IActionResult ReadUserProfileImage(string id) {

     IActionResult response = BadRequest();

     var user =  unitOfWork.User.FirstOrtDefault(u=>u.id==id);
     user.Name="New name";
     return Ok(user);
}

public override void OnActionExecuted(ActionExecutedContext filterContext) {

     unitOfWork.Logs.Add(new CoreHelper.Core.Domain.Log() {
          User = user,
          ResultType = resultType,
          Time = time,
          Controller = controller,
          Action = action,
          Request = requestJson,
          Response = responseJson,
          Ip = ip.ToString(),
          PcName = pcName,
          Url = url,
          ProcessTime = processTime,
          LogCaption = logCaption,
          LogDetail = logDetail,
          IsBefore = isBefore
     });

     unitOfWork.Save();
}

【问题讨论】:

    标签: .net-core unit-of-work action-filter


    【解决方案1】:

    如果您不想对实体进行任何更改,可以使用.AsNoTracking() 选项。

    public IActionResult ReadUserProfileImage(string id) {
    
         IActionResult response = BadRequest();
    
         var user =  unitOfWork.User.AsNoTracking().FirstOrtDefault(u=>u.id==id);
         user.Name="New name";
         return Ok(user);
    }
    

    【讨论】:

    • 但是在项目中有很多这样的方法我无法为所有这些方法编写 asnotracking。我需要控制 actionfilter
    • 我能看到的唯一方法是,您的 UnitOfWork.LogsActionFilter 使用的 DbContext 与所有其他方法不同。你能展示你的 UnitOfWork 类型吗?
    猜你喜欢
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 2016-01-19
    • 2012-08-27
    • 2016-08-24
    • 2011-09-08
    • 2019-05-02
    • 1970-01-01
    相关资源
    最近更新 更多