FOREIGN KEY可能会导致循环或多个级联路径异常[重复]

Posted

技术标签:

【中文标题】FOREIGN KEY可能会导致循环或多个级联路径异常[重复]【英文标题】:FOREIGN KEY may cause cycles or multiple cascade paths exception [duplicate] 【发布时间】:2014-03-12 00:34:26 【问题描述】:

我正在尝试使用 EF Code First 方法创建数据库。

我有 3 个关系表。

+--------+                 +---------+
|  Users |                 | Groups  |
+--------+                 +---------+
|        |  ----------->   |         |
|________|                 |_________|

    |                            |
    |      +--------------+      |
    +--->  |Group Messages|  <---+
           +--------------+
           |              |
           |______________|

箭头表示级联删除方向。

public DBUser()
        
            GroupMessages = new Collection<DBGroupMessage>();
            Groups = new Collection<DBGroup>();
            
        public Guid Id  get; set; 
        public virtual ICollection<DBGroupMessage> GroupMessages  get; set; 
        public virtual ICollection<DBGroup> Groups  get; set; 

public class DBGroup
    
        public DBGroup()
        
            GroupMessages = new Collection<DBGroupMessage>();
        
        public Guid Id  get; set;                    
        [Required]
        public Guid OwnerID  get; set;     
        public DBUser Owner  get; set;     
        public virtual ICollection<DBGroupMessage> GroupMessages  get; set;  
    

public class DBGroupMessage
    
        public DBGroup Group  get; set;     
        [Required]
        public Guid GroupID  get; set;     
        public Guid Id  get; set;     
        public DBUser Owner  get; set;     
        [Required]
        public Guid OwnerID  get; set; 
    

使用 Fluent API 定义的 PK 和 FK。

 modelBuilder.Entity<DBGroup>().HasKey(t => t.Id);
 modelBuilder.Entity<DBGroup>().HasRequired(t => t.Owner).WithMany(t => t.Groups);

modelBuilder.Entity<DBGroupMessage>().HasKey(t => t.Id);
modelBuilder.Entity<DBGroupMessage>().HasRequired(t => t.Owner).WithMany(t => t.GroupMessages);
modelBuilder.Entity<DBGroupMessage>().HasRequired(t => t.Group).WithMany(t => t.GroupMessages);
modelBuilder.Entity<DBUser>().HasKey(t => t.Id);
modelBuilder.Entity<DBUser>().HasMany(t=>t.GroupMessages).WithRequired(t=>t.Owner).WillCascadeOnDelete(false);

在创建模型时,它会在 EntityFramework.dll 中抛出 System.Data.SqlClient.SqlException

消息:

Introducing FOREIGN KEY constraint 'FK_dbo.DBGroupMessages_dbo.DBUsers_OwnerID' on table 'DBGroupMessages' may cause cycles or multiple cascade paths.

Google 没有帮助我 -_-

【问题讨论】:

我了解问题,但不了解解决此问题的方法。表 DBUser 中为 GroupMessages 禁用了级联更新(最后一个代码字符串有问题)。 【参考方案1】:

它在不同于您调用 WillCascadeOnDelete(false) 的表上引发异常。 FK 约束位于 DBGroupMessages 表上。我对 Fluent API 的语法不是很熟悉,但是你应该在 Stack Overflow 上找到一些很好的例子。

例如this one。

【讨论】:

是的,这很有帮助。我在 Fluent API 中的所有一对多关系中添加了.HasForeignKey(),并在这些具有循环或多个级联路径的关系中在.HasForeignKey() 之后调用.WillCascadeOnDelete(false)【参考方案2】:

在您的实体设计中发生了循环递归。 可能的解决方案是更改 DBGroupMessage 类,如下所示

public class DBGroupMessage

    public DBGroup Group  get; set;     
    [Required]
    public Guid GroupID  get; set;     
    public Guid Id  get; set;     
    public DBUser Owner  get; set;     
    public Guid? OwnerID  get; set; 

我的建议是将所有者设为可选。 我希望这能解决您的问题。

【讨论】:

以上是关于FOREIGN KEY可能会导致循环或多个级联路径异常[重复]的主要内容,如果未能解决你的问题,请参考以下文章

错误:引入FOREIGN KEY约束可能会导致循环或多个级联路径

Entity Framework Core 5 - 在表上引入 FOREIGN KEY 约束可能会导致循环或多个级联路径

在表“ReservedSeats”上引入 FOREIGN KEY 约束“FK_ReservedSeats_Seats_SeatId”可能会导致循环或多个级联路径

在表“tblMaintenance”上引入 FOREIGN KEY 约束“FK2CustomerId”可能会导致循环或多个级联路径

ASP.Net MVC 3 EF“在表上引入 FOREIGN KEY 约束可能会导致循环或多个级联路径”

可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束