公共交通限制例外

问题描述 投票:0回答:1

我正在使用 MassTransit 发件箱功能。我经常遇到这样的异常

EntityFramework.Exceptions.Common.ReferenceConstraintException: Reference constraint violation ---> Npgsql.PostgresException (0x80004005): 23503: update or delete on table "InboxState" violates foreign key constraint "FK_OutboxMessage_InboxState_InboxMessageId_InboxConsumerId" on table "OutboxMessage"
.

发生这种情况时,我必须显式从表中删除消息。 如何避免出现此错误?

这是配置代码片段。

busConfig.AddEntityFrameworkOutbox<AppDbContext>(outboxConfig =>
{
    outboxConfig.UsePostgres();
    outboxConfig.UseBusOutbox();

    outboxConfig.QueryMessageLimit = 50;
    outboxConfig.DuplicateDetectionWindow = TimeSpan.FromMinutes(1);
});
c# postgresql masstransit outbox-pattern
1个回答
0
投票

错误原因:

  1. 未处理的消息:OutboxMessage 仍然引用 InboxState 实体。因此,当尝试删除或修改 InboxState 时,它违反了外键约束。
  2. 删除顺序:如果您尝试以错误的顺序删除实体(即,尝试在删除依赖实体之前删除父实体),您将遇到这种约束违规。

解决方案

  1. 删除前确保消息处理 在尝试删除或更新 InboxState 之前,请确保发件箱中的消息已处理并完成(或消耗)。除非关联的发件箱消息被正确使用或处理,否则不应删除 InboxState。

  2. 数据库中的级联删除 您可以在数据库模式中配置级联删除,因此当删除 InboxState 时,它将自动删除 OutboxMessage 表中的相关行。您可以通过在 AppDbContext 中设置级联删除来完成此操作。

配置级联删除示例:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.Entity<OutboxMessage>()
        .HasOne(o => o.InboxState)
        .WithMany() // Assuming InboxState has a navigation property for OutboxMessage
        .HasForeignKey(o => new { o.InboxMessageId, o.InboxConsumerId })
        .OnDelete(DeleteBehavior.Cascade); // Cascade delete when InboxState is deleted
}

在此处阅读有关解决方案的更多信息:https://impetusorgansseparation.com/avnneqwn?key=670ae0c3b093d8e8ac42c57aa7da8c14

© www.soinside.com 2019 - 2024. All rights reserved.