Asp.net mvc 外键约束可能导致循环或多个级联路径[错误消息]
我将Asp.net mvc 外键约束可能导致循环或多个级联路径[错误消息],asp.net-mvc,entity-framework,asp.net-mvc-5,ef-code-first,foreign-keys,Asp.net Mvc,Entity Framework,Asp.net Mvc 5,Ef Code First,Foreign Keys,我将provincesModel的pr\u id作为外键添加到clinicalsmodel。因此VisualStudio会向我显示此错误消息 在表“ClinicsModels”上引入外键约束“FK_dbo.ClinicsModels_dbo.provincessmodels_pr_id”可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他外键约束。 我试图通过浏览网页找到一些解决方案来解决这个问题,但我不知道如何解决这个问题
provincesModel
的pr\u id
作为外键添加到clinicalsmodel
。因此VisualStudio会向我显示此错误消息
在表“ClinicsModels”上引入外键约束“FK_dbo.ClinicsModels_dbo.provincessmodels_pr_id”可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他外键约束。
我试图通过浏览网页找到一些解决方案来解决这个问题,但我不知道如何解决这个问题。因此,我从clinicsModel
中删除了pr\u id
的外键
关系,并运行该项目,但visual studio仍向我显示相同的错误消息。我还重新创建了ClinicsModel
,并尝试使用updatedatabase-Verebose Migrations
更新数据库,使用packagemanager控制台
,但它仍然显示相同的错误消息
这是我的密码:
对于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; }
}
}
当我重定向到http://localhost:3110/Doctors/index
这是错误消息的快照。
博士模型
:
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; }
}
}
public class DoctorsModel
{
[Key]
public int d_id { get; set; }
public string d_name { get; set; }
public string contact { get; set; }
public string cnic { get; set; }
public string email { get; set; }
public string gender { get; set; }
//Forigen Key
public ICollection<DocExperiencesModel> experiences { get; set; }
public ICollection<DocSpecialization> specializations { get; set; }
public ICollection<QualificationsModel> qualifications { get; set; }
public ICollection<DoctorProfileModel> profiles { get; set; }
}
公共类博士模型
{
[关键]
公共int d_id{get;set;}
公共字符串d_name{get;set;}
公共字符串联系人{get;set;}
公共字符串cnic{get;set;}
公共字符串电子邮件{get;set;}
公共字符串{get;set;}
//福里根键
公共ICollection体验{get;set;}
公共ICollection专用化{get;set;}
公共ICollection限定{get;set;}
公共ICollection配置文件{get;set;}
}
为了便于理解,这里是我的数据库模式。
请指导我该怎么办?我将非常感谢他/她。乍一看,错误发生在pr\u id
作为外键添加到ClinicsModel
时,因为ProvincesModel
与涉及pr\u id
主键字段的ClinicsModel
表有一对多关系。由于引用pr\u id
的所有外键都不可为空,因此涉及ProvincesModel
的所有一对多关系在默认情况下都启用了级联删除。因此,这意味着当删除一个ClinicsModel
实体数据时,它将有两个级联删除路径:通过CitiesModel
和直接到ProvincesModel
,如下图所示
因此,它与从ClinicsModel
到ProvincesModel
的多个级联删除路径建立循环关系,从而导致SQL Server中出现错误1785
要解决关系问题,pr\u id
外键应声明为Nullable
:
同样,如果ct\u id
(以及其他可能存在循环关系的int
外键属性)也返回相同的错误,则使用与上述相同的方式声明它们:
public int? ct_id { get; set; }
NB:如果正在使用Fluent API(首先是代码),请尝试在下面添加以下行:
// 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);
//摘自/a/20915232
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove();
}
//修改自/a/17127512
//用于具有循环关系的所有实体
var builder=new DbModelBuilder();
builder.Entity()
.has必需(x=>x.ct\u id)
.有很多
.WillCascadeOnDelete(假);
builder.Entity()
.has必需(x=>x.pr\u id)
.有很多
.WillCascadeOnDelete(假);
类似问题:
// 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);