问题描述
我有一个名为 Provider
的表,它与另一个表 State
具有三个关系。在这些关系中,一个是必需的,另外两个是可选的。见下图关系:
以下是实体以及每个实体的流畅配置。
供应商
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
。不知道为什么两个类似配置的可选关系不同。
问题:
- 为什么
No Action
会因该错误而失败?我不明白是如何导致循环或多个级联路径的。 - 为什么去掉
update-database
会为一个可选关系创建一个带有OnDelete(DeleteBehavior.SetNull)
删除规则的外键,而为另一个创建一个带有Set Null
的外键? - 配置这种关系的正确方法是什么?即一个必需关系和两个可选关系,可选关系的外键应该有一个删除规则
No Action
。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)