.net core 是什么导致了我的DbUpdateConcurrencyException?
在我的.NET Core Web API中,我实现了事务发件箱模式来监视数据库表,并在数据库表中出现记录时将消息发布到Azure Service Bus主题。这发生在从Microsoft.Extensions.Hosting.BackgroundService继承的托管服务类中。这是我拥有的一个精简版本:.net core 是什么导致了我的DbUpdateConcurrencyException?,.net-core,entity-framework-core,dbcontext,azure-servicebus-topics,.net Core,Entity Framework Core,Dbcontext,Azure Servicebus Topics,在我的.NET Core Web API中,我实现了事务发件箱模式来监视数据库表,并在数据库表中出现记录时将消息发布到Azure Service Bus主题。这发生在从Microsoft.Extensions.Hosting.BackgroundService继承的托管服务类中。这是我拥有的一个精简版本: protected override async Task ExecuteAsync(CancellationToken stoppingToken) {
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
try
{
IEnumerable<RelayMessage> messagesToSend = new List<RelayMessage>();
// _scopeFactory is an implementation of Microsoft.Extensions.DependencyInjection.IServiceScopeFactory:
using (var scope = _scopeFactory.CreateScope())
{
var dbContext = scope.ServiceProvider.GetRequiredService<MyDbContext>();
while (!stoppingToken.IsCancellationRequested)
{
messagesToSend = await dbContext.RelayMessage.ToListAsync();
foreach (var message in messagesToSend)
{
try
{
await SendMessageToAzureServiceBus(message);
dbContext.RelayMessage.Remove(message);
dbContext.SaveChanges();
}
catch (Exception ex)
{
Log.Error(ex, $"Could not send message with id {message.RelayMessageId}.");
}
}
await Task.Delay(5000, stoppingToken);
}
}
await Task.CompletedTask;
}
catch (Exception ex)
{
Log.Error(ex, "Exception thrown while processing messages.");
}
我确实在异常消息中签出了,但不确定该信息是否适用于我的情况。RelayMessage实例被创建并保存到数据库中(在此处未显示的方法中),然后该方法读取并删除它。在应用程序的任何地方都没有这种类型的修改,所以我不清楚这是如何造成并发问题的
我非常感谢你的帮助
编辑:
下面是我在Startup.cs中的DbContext注册:
services.AddDbContext<MyDbContext>(o =>
{
o.UseSqlServer(Configuration.GetConnectionString("MyConnectionString"));
});
services.AddDbContext(o=>
{
o、 使用SQLServer(Configuration.GetConnectionString(“MyConnectionString”);
});
我可以在启动时查看上下文注册吗?@go我添加了上下文注册。有很多不同的方法。我想知道你是怎么做到的。问题可能就在那里。免责声明:我对Azure一无所知;我们使用AWS。但是通常这个错误意味着其他的东西改变了事务下面的数据库。您的web api有多少个实例正在运行?你确定只有一个实例可以同时处理同一条记录吗?我可以在启动时看到上下文注册吗?@go我添加了上下文注册。有很多不同的方法。我想知道你是怎么做到的。问题可能就在那里。免责声明:我对Azure一无所知;我们使用AWS。但是通常这个错误意味着其他的东西改变了事务下面的数据库。您的web api有多少个实例正在运行?您确定一次只能有一个实例尝试处理同一条记录吗?
services.AddDbContext<MyDbContext>(o =>
{
o.UseSqlServer(Configuration.GetConnectionString("MyConnectionString"));
});