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约束