引入 FOREIGN KEY 约束...可能会导致循环或多个级联路径 - 实体框架

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

我是实体框架的新手,我已经尝试修复这个问题好几个小时了,但我现在完全不知所措。

有人能好心指出我在这里缺少什么吗?

当我尝试运行更新数据库时出现此错误:

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

我尝试在 OnModelCreating 中关闭级联删除:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<ContainerActie>()
      .HasOne(c => c.Locatie)
      .WithMany(c => c.ContainerActies)
      .HasForeignKey(c => c.LocatieId)
      .OnDelete(DeleteBehavior.Restrict);
}

但是好像没有什么效果

public class ContainerActie : SQLModel
{
    [Category("DB")]
    [Key]
    public int ContainerActieId { get; set; }

    [Category("Info")]
    public Container Container { get; set; }

    [Category("Info")]
    public Actie Actie { get; set; }

    [Category("Info")]
    public Relatie Relatie { get; set; }

    [Category("Info")]
    public int LocatieId { get; set; }

    [Category("Info")]
    public Locatie Locatie { get; set; }

    [Category("Info")]
    public DateTime DateTime { get; set; }
}

public class Locatie : SQLModel
{
    [Category("DB")]
    [Key]
    public int LocatieId { get; set; }

    [Category("Info")]
    [Required]
    public string Naam { get; set; }

    [Category("Info")]
    public string? Adres { get; set; }

    [Category("Info")]
    public string? Gemeente { get; set; }

    [Category("Info")]
    public string? Postcode { get; set; }

    [Category("Info")]
    public string? Tel { get; set; }

    [Category("Info")]
    public string? Commentaar { get; set; }

    [Category("Info")]
    public List<ContainerActie>? ContainerActies { get; set; }
}
c# entity-framework
2个回答
3
投票

这是因为外键

LocatieId
不可为空,如果该键不可为空则必须删除相关对象,而循环关系不允许这样做。


0
投票

我在创建数据库表时也遇到了类似的错误,尽管您可以通过在 OnModelCreating 中显式定义它来解决此问题,但通过将 [DeleteBehavior(DeleteBehavior.ClientSetNull)] 添加到外部属性例如

[Category("Info")]
[DeleteBehavior(DeleteBehavior.ClientSetNull)]
public Actie Actie { get; set; }

对于连接表添加

[DeleteBehavior(DeleteBehavior.ClientCascade)]    

相反。

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