【发布时间】: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