首页 文章

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

提问于
浏览
1

我首先为我的项目使用实体代码 . 基本上我有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约束 .

你能帮我吗?

Update
这是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 .....

2 回答

  • 1

    长时间不能handle multiple cascade pathscascade delete to same table一直是Sql Server的限制 . 只是谷歌的错误信息 . 基本上,如果你想使用级联删除,那么你必须确保只有一个级联路径 .

    目前,您有两个来自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) . 见Entity Framework documentation .

    除此之外,你的模型似乎有点奇怪 . 你看起来正在尝试创建一个多对多的链接/连接表UsersBranchs,但你在Branchs上也有一个用户并没有多大意义 . 在这种情况下你甚至需要UsersBranchs表吗?你的意思是在你的分支上有一个用户集合,即导航属性而不是外键,它提供了一对多的关系分支 - >用户?

    另外,我真的不喜欢将复数用于单个实体 .

  • 1

    我认为你得到的问题是因为你没有告诉Entity框架它将如何在cascade上删除这些类

    在您的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);
    }
    

    希望对你有帮助

相关问题