【问题标题】:dbContext Won't UpdatedbContext 不会更新
【发布时间】:2021-08-30 01:19:37
【问题描述】:

我有一个命令类作为 CQRS 工作流的一部分。它插入并更新几个不同的表,如下所示:

public class ClassName : IBusinessCommand<CommandRequest, CommandResult>

private readonly DatabaseContext _dbContext;

public ClassName(DatabaseContext dbContext)
{
    _dbContext = dbContext;
}


public async Task<CommandResult> ExecuteAsync(CommandRequest request, CancellationToken token)
{
    var user = _dbContext.Users.NoTracking()
        .Where(x => x.request.UserId);

    if (user != null)
    {
        var class = new Class
        {
             ClassID = 1,
             UserID = user.UserID,
             CreateDate = _clock.UtcNow
        }

        _dbContext.Classes.Add(class);
    }

    var seat = await FunctionThatGetsSeatRecord(token);

    seat.ModifyDate = _clock.UtcNow;
    seat.SeatsUsed++;
    seat.SeatsRemaining--

    return CommandResult.WithSuccess();
}

我们有一个名为 CommandRunner 的基类(用于我们的所有命令,例如这样)。在这个基类中,它调用 ExecuteAsync 函数(无论传入哪个类型参数),如下:

var command = _container.Resolve<IBusinessCommand<TData, TResult>>(
    new TypedParameter(typeof(IHoneyBeeDbContext), dbContext));
                    
var result = await command.ExecuteAsync(data, token);
await dbContext.SaveChangesAsync();
transaction.Commit();

以便对该命令 dbContext 所做的所有更改都保存并作为单个事务提交。 我们已经为我们的 CQRS 安装了同样的基础设施一段时间了,它运行得非常好。上面的类以前在不同的服务类中,我决定将它转换为我们的 CQRS 流,所以我把它变成了一个命令。 由于我无法弄清楚的原因(我已经考虑了几个小时),我可以让创建的类正确添加到数据库中,但我无法更新座位记录。我已经调试了整个类,并在整个流程中跟踪并检查了 _dbContext 变量,并且更新在其中正确显示,但是当它被保存和提交时,它不会为那个变量更新数据库(但它确实适用于类)。 有人知道这里有什么问题吗?

【问题讨论】:

  • FunctionThatGetsSeatRecord 是否在没有跟踪的情况下获得座位?
  • @CaiusJard 我也在对这些查询使用 NoTracking()。
  • 如果你想修改,不要使用 NoTracking(),因为上下文需要跟踪变化,你用 NoTracking() 阻止它
  • @Tunjay 非常感谢!!我想我应该对 NoTracking() 的实际作用做更多的研究,我只是在修改一个现有的查询,我想我没有意识到它做了什么。
  • 您发布的内容没有明显错误。您需要进行更多调试,如果您将问题简化为小型、独立的重现,请将其发布在您的问题中。

标签: c# .net entity-framework linq-to-entities


【解决方案1】:

您指出返回座位的函数使用了 NoTracking()(AsNoTracking() 的错字?),这会关闭更改跟踪,因此 EF 对您对座位所做的更改视而不见。

不要对您计划查询、更新和保存实体的集合使用“无跟踪”

(在某些 EF 版本或情况下使用它可能根本不会带来任何好处,请参阅https://github.com/dotnet/efcore/issues/14366

未跟踪实体的详细信息:What difference does .AsNoTracking() make?

【讨论】:

  • 谢谢,我会记住的。我不完全确定 AsNoTracking() 做了什么,因为我刚刚改造了一些现有的查询。
猜你喜欢
  • 2019-10-14
  • 2020-05-29
  • 1970-01-01
  • 1970-01-01
  • 2022-06-22
  • 2017-01-24
  • 1970-01-01
  • 1970-01-01
  • 2021-06-21
相关资源
最近更新 更多