FOREIGN KEY约束可能导致循环或多个级联路径[错误消息]

时间:2017-03-12 06:28:11

标签: asp.net-mvc entity-framework asp.net-mvc-5 ef-code-first foreign-keys

我将provincesModel pr_id作为foreign Key添加到clinicsModel。因此,visual studio会显示此错误消息

Introducing FOREIGN KEY constraint 'FK_dbo.ClinicsModels_dbo.ProvincesModels_pr_id' on table 'ClinicsModels' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.

我尝试通过在网上浏览找到解决方案来解决问题,但我无法解决这个问题。因此,我从foreign key中移除了pr_id的{​​{1}}关系并运行该项目,但仍然可视工作室向我显示相同的错误消息。我还重新创建clinicsModel并尝试使用ClinicsModel使用Update-Database -Verebose Migrations更新数据库,但它仍显示相同的错误消息。

这是我的代码:

代表package manager console

ProvinceModel

namespace finalFyp.Models { public class ProvincesModel { [Key] public int pr_id { get; set; } public string pr_name { get; set; } public ICollection<CitiesModel> cities { get; set; } } }

ClinicsModel

当我重定向到 public class ClinicsModel { [Key] public int clinic_id { get; set; } public string clinic_name { get; set; } public string clinic_address { get; set; } //Forigen Keys public int ct_id { get; set; } public CitiesModel city { get; set; } } } 时发生错误 这是错误消息的快照。 enter image description here

http://localhost:3110/Doctors/index

DoctorsModel

为了便于理解这是我的数据库的架构。 enter image description here

请指导我我想做什么?我将非常感谢他/她。

1 个答案:

答案 0 :(得分:0)

从第一眼看,当pr_id作为ClinicsModel的外键添加时发生错误,因为ProvincesModelClinicsModel表有一对多关系,涉及pr_id 1}}主键字段。由于引用pr_id的所有外键都不可为空,因此所涉及ProvincesModel的所有一对多关系都默认启用级联删除。因此,这意味着当删除ClinicsModel实体数据时,它将有2个级联删除路径:通过CitiesModel并直接转到ProvincesModel,如下图所示。

Multiple Cascade Delete

因此,它与从ClinicsModelProvincesModel的多个级联删除路径建立循环关系,导致SQL Server中出现错误1785.

要解决关系问题,pr_id外键应声明为Nullable<int>

public int? pr_id { get; set; }

同样,如果ct_id(和其他int外键属性受到可能的循环关系)也返回相同的错误,请以与上述相同的方式声明它们:

public int? ct_id { get; set; }

NB:如果正在使用Fluent API(和Code First),请尝试在下面添加以下这些行:

// taken from /a/20915232
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
}

// modified from /a/17127512
// used on all entities with circular relationships
var builder = new DbModelBuilder();
builder.Entity<CitiesModel>()
       .HasRequired(x => x.ct_id)
       .WithMany()
       .WillCascadeOnDelete(false);

builder.Entity<ProvincesModel>()
       .HasRequired(x => x.pr_id)
       .WithMany()
       .WillCascadeOnDelete(false);

类似问题:

Introducing FOREIGN KEY constraint may cause cycles or multiple cascade paths - why?

Introducing FOREIGN KEY constraint may cause cycles or multiple cascade paths

Error message 1785 occurs when you create a FOREIGN KEY constraint that may cause multiple cascade paths