微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

EF Core 中与同一个表的多个关系,其中一个是必需的,其他是可选的 供应商状态

如何解决EF Core 中与同一个表的多个关系,其中一个是必需的,其他是可选的 供应商状态

我有一个名为 Provider 的表,它与另一个State 具有三个关系。在这些关系中,一个是必需的,另外两个是可选的。见下图关系:

multiple relationship

以下是实体以及每个实体的流畅配置。

供应商

public class Provider
{
    public int Id { get; set; }

    [required]
    public int PrimaryStateId { get; set; }
    public virtual State PrimaryState { get; set; }

    public int? BillingStateId { get; set; }
    public virtual State BillingState { get; set; }

    public int? ShippingStateId { get; set; }
    public virtual State ShippingState { get; set; }
}

class ProviderConfig : IEntityTypeConfiguration<Provider>
{
    public void Configure(EntityTypeBuilder<Provider> entity)
    {
        entity.HasOne(x => x.PrimaryState)
              .WithMany(x => x.ProvidersPrimary)
              .Isrequired(true)
              .OnDelete(DeleteBehavior.Restrict);

        entity.HasOne(x => x.BillingState)
              .WithMany(x => x.ProvidersBilling)
              .Isrequired(false)
              .OnDelete(DeleteBehavior.SetNull);

        entity.HasOne(x => x.ShippingState)
              .WithMany(x => x.ProvideRSShipping)
              .Isrequired(false)
              .OnDelete(DeleteBehavior.SetNull);
    }
}

状态

public class State
{
    public int Id { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Provider> ProvidersPrimary { get; set; } = new List<Provider>();
    public virtual ICollection<Provider> ProvidersBilling { get; set; } = new List<Provider>();
    public virtual ICollection<Provider> ProvideRSShipping { get; set; } = new List<Provider>();
}

class StateConfig : IEntityTypeConfiguration<State>
{
    public void Configure(EntityTypeBuilder<State> entity)
    {
        entity.Property(x => x.Name).Isrequired();
        entity.HasIndex(x => x.Name).IsUnique();
    }
}

如您所见,我想为 DeleteBehavior.Restrict 设置 PrimaryState,为其他两个关系设置 DeleteBehavior.SetNull。但是,这会在 update-database 上引发错误显示以下消息:

在表 'Provider' 上引入 FOREIGN KEY 约束 'FK_Provider_State_ShippingStateId' 可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。 无法创建约束或索引。查看以前的错误

但是,如果我摆脱了其中一个可选关系,它就可以正常工作。也就是说,当我有一个必需关系和一个可选关系时它起作用,但当我有一个必需关系和两个可选关系时不起作用。此外,如果我从可选关系中删除 OnDelete(DeleteBehavior.SetNull),它工作正常,但是在数据库中,外键 BillingStateId删除规则最终是 Set Null,但对于 {{ 1}} 是 ShippingStateId。不知道为什么两个类似配置的可选关系不同。

问题:

  1. 为什么 No Action 会因该错误而失败?我不明白是如何导致循环或多个级联路径的。
  2. 为什么去掉 update-database 会为一个可选关系创建一个带有 OnDelete(DeleteBehavior.SetNull) 删除规则的外键,而为另一个创建一个带有 Set Null 的外键?
  3. 配置这种关系的正确方法是什么?即一个必需关系和两个可选关系,可选关系的外键应该有一个删除规则No Action

VS 解决方链接click

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。