.net 编码同一表中前两个外键

6l7fqoea  于 2022-11-19  发布在  .NET
关注(0)|答案(2)|浏览(128)

首先使用EntityFrameworkCore(5.0.17)代码,我在实现一个类时遇到了麻烦,这个类有两个对另一个类的引用。
这是我结构:
第一个
位置引用上的Required属性使得无法更新数据库上的表。这是我收到的错误消息:
在表' Races '上引入FOREIGN KEY约束' FK_Races_Locations_StartLocationId '可能导致循环或多个级联路径
指定ON DELETE NO ACTIONON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。
无法创建约束或索引。

k7fdbhmy

k7fdbhmy1#

该模型有多个级联路径:

Beneficio -> ComercioBeneficio
          -> ComercioOtorgador

而SQL Sever不允许这样做。要了解这一点,请查看以下数据:

BeneficioA -> (Beneficio) ComercioA
           -> (Otorgador) ComercioA

BeneficioA中,Beneficio和Otorgador是同一个ComercioA .那么当BeneficioA被删除时,ComercioA被级联删除两次。
但这似乎是合法的,只需要ComercioA一次。其他DBMS,如MySQL管理这一点。那么为什么不SQL Server?
我不知道,也没有找到任何官方信息。只找到了这个:
SQL Server - Why can't we have multiple cascade paths?
...因此,该实现并没有修复它,而是通过防止定义重复的级联路径来避免它。这显然是一条捷径...
SQL Server有这个限制,我们需要接受它。一个解决方案是通过将外键和导航属性设置为nullable来禁用删除级联行为:

public class Beneficio
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public int? ComercioBeneficioId { get; set; }
    public int? ComercioOtorgadorId { get; set; }

    [ForeignKey("ComercioBeneficioId")]
    public Comercio? ComercioBeneficio { get; set; }
    [ForeignKey("ComercioOtorgadorId")]
    public Comercio? ComercioOtorgador { get; set; }
}
iszxjhcz

iszxjhcz2#

您可以使用fluent api来配置关系。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Comercio>()
       .HasMany<Beneficio>()
       .WithOne(g => g.ComercioBeneficio)
       .HasForeignKey(j => j.ComercioBeneficioId).OnDelete(DeleteBehabiour.SetNull);
 }

在两个属性上都这样做。

相关问题