我有一个命令类作为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变量,更新正确地显示在其中,但是当它被保存和提交时,它不会更新该变量的数据库(但它会更新类的数据库)。有没有人看到这里可能出了什么问题?
发布于 2021-06-14 13:44:48
您指出返回座位的函数使用NoTracking() ( AsNoTracking()的拼写错误?),它关闭了更改跟踪,因此EF对您对座位所做的更改视而不见。
不要对计划查询、更新和保存其中的实体的集合使用"No Tracking“
(在某些EF版本或情况下使用它可能不会带来任何好处,请参阅https://github.com/dotnet/efcore/issues/14366)
有关非跟踪实体的详细信息:What difference does .AsNoTracking() make?
https://stackoverflow.com/questions/67965092
复制相似问题