.net core 是什么导致了我的DbUpdateConcurrencyException?

.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) {

在我的.NET Core Web API中,我实现了事务发件箱模式来监视数据库表,并在数据库表中出现记录时将消息发布到Azure Service Bus主题。这发生在从Microsoft.Extensions.Hosting.BackgroundService继承的托管服务类中。这是我拥有的一个精简版本:

 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"));
 });