【问题标题】:Entity Framework Code first Foreign Key may cause cycles or multiple cascade pathsEntity Framework Code first Foreign Key 可能导致循环或多个级联路径
【发布时间】:2015-04-26 20:42:00
【问题描述】:

我收到以下错误:

附加信息:引入 FOREIGN KEY 约束 表 'Clubs' 上的 'FK_dbo.Clubs_dbo.Addresses_Address_Id' 可能会导致 循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。

俱乐部模式

public class Club
{

    [Key]
    public int ClubId { get; set; }

    //[Required(ErrorMessage = "Club name is required")]
    [DisplayName("Club name")]
    public string Name { get; set; }

    //[Required(ErrorMessage = "Address is required")]
    public virtual Address Address { get; set; }
}

地址模型

public class Address
{
    //[Required]
    [Key]
    public int AddressId { get; set; }

    //[Required(ErrorMessage = "Address is required")]
    [DisplayName("Address")]
    public string FirstLine { get; set; }

    //[Required(ErrorMessage = "Town is required")]
    [DisplayName("Town")]
    public string Town { get; set; }

    //[Required(ErrorMessage = "County is required")]
    [DisplayName("County")]
    public string County { get; set; }

    [StringLength(8)]
    [DisplayName("Postcode")]
    public string Postcode { get; set; }
}

这是一对一的关系。

我已经尝试了几种解决方案来解决这个问题,删除了所需的数据注释。

我也试过这个代码:

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

    modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
    modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();

}

我也试过这个解决方案:

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

        modelBuilder.Entity<Address>().HasKey(a => a.AddressId);
        modelBuilder.Entity<Club>().HasRequired(a => a.Address);
  }

我哪里出错了,我该如何纠正?

【问题讨论】:

  • 您的数据库中是否还有其他可能导致此错误的键?我觉得这里缺少一些额外的信息。
  • 嗨,大卫,我还有 11 个模型,但 VS 抛出有关俱乐部和地址模型的错误。我应该把其他 11 个模型放在一起吗?
  • EF 抛出该错误是因为您的数据库已抛出该错误。这是级联引用的 SQL Server 错误。正如您所猜测的,Is 与 Clubs 和 Address 模型有关,但可能由于之前的一些级联关系而被抛出。这里的重点是,如果在删除地址时它还应该删除俱乐部记录,但由于之前对两个表的一些级联效应,俱乐部可能已经被删除,那么 SQL 服务器会感到困惑。请在此处粘贴这两个实体的所有关系及其所有​​代码。

标签: c# sql-server entity-framework


【解决方案1】:

我认为ClubAddress 之间的关系不是一对一的,而是一对多的。正确配置这种关系的方式是这样的:

  modelBuilder.Entity<Club>().HasRequired(a => a.Address).WithMany();

现在,回到您的问题,当您有多个级联删除路径时会导致该异常。如果依赖实体上的外键不可为空(如您的情况),则 Code First 在关系上设置级联删除.所以我假设你有另一个关系涉及Club 实体,当你从Clubs 表中删除一条记录时,这个删除可能会结束尝试删除@987654328 中的同一条记录@表。

我建议你看看这个post 并检查你是否有类似@KristofClaes 答案中显示的示例的情况。

您可以通过使用Fluent API 禁用级联删除或将某些关系定义为可选(使用可为空的外键)来避免这种模棱两可的删除路径。例如,使用 Fluent Api,您可以配置您的关系,如下所示:

modelBuilder.Entity<Club>().HasRequired(a => a.Address).WithMany().WillCascadeOnDelete(false);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-18
    • 2016-07-22
    • 2020-06-14
    • 2021-08-24
    • 2017-06-04
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    相关资源
    最近更新 更多