c# - Entity Framework 、外键约束可能会导致循环或多条级联路径

标签 c# .net sql-server entity-framework

我首先在我的项目中使用实体代码。基本上我有 3 个类 UsersBranchsUsersBranchs

Users 包含 UserIDName 、...

Branchs 包含 BranchIDLocation、... 和 UserID(指分支的创建者) UsersBranchs 只有两列 BranchID 和 UserID,定义哪个用户位于哪个分支

问题是我收到此错误:

'FK_dbo.UsersBranchs_dbo.Users_UsersID' on table 'UsersBranchs' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.

你能帮我吗?

更新
这是 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 });


Branchs Class is

   [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 .....

最佳答案

无法 handle multiple cascade pathscascade delete to same table长期以来一直是 Sql Server 的限制。只需 Google 一下错误消息即可。基本上,如果您想使用级联删除,那么您必须确保只有一个级联路径。

目前,您有两条路径:分支 -> UsersBranchs 和分支 -> 用户 -> 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,但分支上也有一个用户,这实际上没有意义。在这种情况下,您是否还需要 UsersBranchs 表?您是否打算在分支上拥有一组用户,即导航属性而不是外键,从而提供一对多关系分支 -> 用户?

顺便说一句,我真的不喜欢对单个实体使用复数。

关于c# - Entity Framework 、外键约束可能会导致循环或多条级联路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27792131/

相关文章:

.net - 如何确保在部署新的 CSS 或 JavaScript 文件后客户端浏览器缓存已被刷新?

.net - VB.NET 读取文本区域中的当前行?

c# - 在 asp.net c# 中使用 SQL Server 存储过程输出

sql-server - 为什么批量插入的错误文件不起作用?

c# - 添加前缀以控制 id 并仍然绑定(bind) MVC Razor

javascript - ASP.NET UserControl javascript 未将 HTML 加载到其变量

c# - 改变多边形的点

c# - 什么时候在 SQL 命令中使用非参数化变量是安全的?

c# - Windows 窗体是否有任何开源或免费的图形/报告/图表框架?

c# - 无法将存储过程表输出获取到我的 .NET 应用程序中