我收到以下错误:
其他信息:介绍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);
}
我哪里出错了,如何纠正?
答案 0 :(得分:1)
我认为Club
和Address
之间的关系并非一对一,而是一对多。配置此关系的正确方法是这样的:
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);