实体框架代码第一个外键可能导致循环或多个级联路径

时间:2015-02-25 00:38:43

标签: c# sql-server entity-framework

我收到以下错误:

  

其他信息:介绍FOREIGN KEY约束   表'俱乐部'上的'FK_dbo.Clubs_dbo.Addresses_Address_Id'可能会导致   循环或多个级联路径。指定ON DELETE NO ACTION或ON   更新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);
  }

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

1 个答案:

答案 0 :(得分:1)

我认为ClubAddress之间的关系并非一对一,而是一对多。配置此关系的正确方法是这样的:

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

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

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

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

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