繁体   English   中英

实体框架,外键约束可能会导致循环或多个级联路径

[英]Entity Framework, Foreign key constraint may cause cycles or multiple cascade paths

我首先为项目使用实体代码。 基本上我有3类UsersBranchsUsersBranchs

Users包含UserIDName ,...

Branchs包含BranchIDLocation ,...和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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM