![](/img/trans.png)
[英]SQL Error: Introducing FOREIGN KEY constraint may cause cycles or multiple cascade paths. Entity Framework Core
[英]Entity Framework, Foreign key constraint may cause cycles or multiple cascade paths
我首先为项目使用实体代码。 基本上我有3类Users
, Branchs
和UsersBranchs
。
Users
包含UserID
, Name
,...
Branchs
包含BranchID
, Location
,...和UserID,这是指分支的创建者,而UsersBranchs
仅具有两列BranchID和UserID,用于定义哪个用户位于哪个分支中
问题是我收到此错误:
表“ UsersBranchs”上的“ FK_dbo.UsersBranchs_dbo.Users_UsersID”可能会导致循环或多个级联路径。 指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。
你能帮我吗?
更新
这是UsersBranchs类
[ForeignKey("UserID")]
public CoreUsers User { get; set; }
public Guid UsersID { get; set; }
[ForeignKey("BranchID")]
public Branchs Branch { get; set; }
public Guid BranchID { get; set; }
并将此行添加到DbContext类以使用UserID和BranchID作为键
modelBuilder.Entity<UsersBranchs>().HasKey(x => new { x.UserID, x.BranchID });
分支机构现为
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Key]
public Guid ID { get; set; }
[ForeignKey("UserID")]
public CoreUsers User { get; set; }
public Guid UserID { get; set; }
public .....
现“用户类别”为
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Key]
public Guid ID { get; set; }
public .....
长期以来,Sql Server一直无法处理多个级联路径并无法将其级联删除到同一表 。 仅Google错误消息。 基本上,如果要使用级联删除,则必须确保只有一个级联路径。
目前,您有两个来自Branchs-> UsersBranchs和Branchs-> Users-> UsersBranchs的路径。
EF默认情况下会设置级联删除,但是可以通过删除DbContext中的约定来停止它。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// Manually set cascade delete behaviour
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
base.OnModelCreating(modelBuilder);
}
然后,您必须在要级联删除的任何关系上设置WillCascadeOnDelete(true)。 请参阅实体框架文档 。
除此之外,您的模型似乎有些奇怪。 您看起来好像在尝试创建多对多链接/联接表UsersBranchs,但是在Branchs上也只有一个User并没有什么意义。 在这种情况下,您甚至需要UsersBranchs表吗? 您是否意味着在分支机构上拥有一组用户,即导航属性而不是外键,从而提供了一对多关系“分支机构->用户”?
顺便说一句,我真的不喜欢对单个实体使用复数。
我认为您遇到了问题,因为您没有告诉Entity Framework在层叠删除时如何处理这些类
在您的DbContext类中,重写OnModelCreating方法并编写此代码
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<UserBranch>()
.HasRequired(t => t.CoreUsers)
.WithMany()
.HasForeignKey(t => t.UserID)
.WillCascadeOnDelete(false);
modelBuilder.Entity<UserBranch>()
.HasRequired(t => t.Branch)
.WithMany()
.HasForeignKey(t => t.BranchID)
.WillCascadeOnDelete(false);
modelBuilder.Entity<Branch>()
.HasRequired(t => t.User)
.WithMany()
.HasForeignKey(t => t.UserID)
.WillCascadeOnDelete(false);
}
希望这个能对您有所帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.