ef中,我们创建外键的时候需要注意,否则会出现标题所示问题。

例:有项目表,项目收藏表,用户表

项目表有如下字段:ProjectId,InputPersonId等

项目收藏表有如下字段:ProjectId,UseId等

用户表有如下字段:用户id等

项目表:

 public partial class ProjectInfoMap : EntityTypeConfiguration<ProjectInfo>
{
public ProjectInfoMap()
{
this.ToTable("ProjectInfo");
this.HasKey(pr => pr.Id);
this.Property(pr => pr.Id).HasColumnName("ProjectId");
this.HasRequired(pr => pr.InputPerson)
.WithMany()
.HasForeignKey(pr => pr.InputPersonId); }
}

项目收藏表:

 public partial class ProjectCollectMap : EntityTypeConfiguration<ProjectCollect>
{
public ProjectCollectMap()
{
this.ToTable("ProjectCollect");
this.HasKey(pc => pc.Id); this.HasRequired(pc => pc.ProjectInfo)
.WithMany(p => p.ProjectCollects)
.HasForeignKey(pc => pc.ProjectId); this.HasRequired(pc => pc.User)
.WithMany(u=>u.ProjectCollects)
.HasForeignKey(pc => pc.UserId);
}
}

用户表:

public partial class UserMap: EntityTypeConfiguration<User>
{
public SISTUserMap()
{
this.ToTable("User");
this.HasKey(u => u.Id);
this.Property(u => u.Id).HasColumnName("UserId");
} }

分析一下,假如删除用户表的某个用户数据,

则有如下级联删除,即删除用户的时候有多个路径可以级联删除项目收藏表,则会出现标题所示错误

删除用户 -> 删除项目 -> 删除项目收藏表(这里删除项目的同时会删除项目收藏表)

删除用户 -> 删除项目收藏表

解决方法如下:

1.删除其中一个级联删除,代码如下所示,不建议这样做,因为这样的映射原本就不太恰当。

 public partial class ProjectInfoMap : EntityTypeConfiguration<ProjectInfo>
{
public ProjectInfoMap()
{
this.ToTable("ProjectInfo");
this.HasKey(pr => pr.Id);
this.Property(pr => pr.Id).HasColumnName("ProjectId");
this.HasRequired(pr => pr.InputPerson)
.WithMany()
.HasForeignKey(pr => pr.InputPersonId)
.WillCascadeOnDelete(false); }
}

2.将InputPerson映射为输入用户-项目表,即用另外一张表关联输入用户和项目id。同时ProjectInfo去除

this.HasRequired(pr => pr.InputPerson)
.WithMany()
.HasForeignKey(pr => pr.InputPersonId);
 public partial class ProjectInputPersonMap : EntityTypeConfiguration<ProjectInputPerson>
{
public ProjectInputPersonMap()
{
this.ToTable("ProjectInputPerson");
this.HasKey(pc => pc.Id); this.HasRequired(pc => pc.ProjectInfo)
.WithOptional(p => p.InputPerson); this.HasRequired(pc => pc.User)
.WithMany()
.HasForeignKey(pc => pc.UserId);
}
}

如有描述不对的地方,请在评论中指出。

关于EF中出现FOREIGNKEY约束可能会导致循环或多重级联路径的问题的更多相关文章

  1. C# json反序列化 对象中嵌套数组 (转载) 可能会导致循环或多重级联路径。请指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。

    C# json反序列化 对象中嵌套数组 (转载)   看图: 这里可以看到是二层嵌套!!使用C#如何实现?? 思路:使用list集合实现 → 建立类 → list集合 → 微软的   Newtonso ...

  2. EF Core 遇到“可能会导致循环或多重级联路径”

    在ef core中你可能会设计这样一个实体: public class Customer : Entity,IMustHaveTenant, IHasCreationTime { public Cus ...

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

    错误提示:可能会导致循环或多重级联路径.请指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束. 原因:自表连接(同一张表 ...

  4. EFCore的外键级联删除导致的【可能会导致循环或多重级联路径】

    之前也是经常遇到这个问题,但好在每次创建的实体不多,很容易就能找到是哪个外键导致级联循环删除问题 之前都是这么处理,因为创建的实体也不多,所以还处理得来 但最近跟别人合作写后端,别人写了好多实体,我一 ...

  5. Entity Framework Code first 可能会导致循环或多个级联路径.

    用code first映射数据库报错 Introducing FOREIGN KEY constraint 'FK_dbo.Roles_dbo.SubSystems_SubSystemID' on t ...

  6. EntityFramework_MVC4中EF5 新手入门教程之四 ---4.在EF中创建更复杂的数据模型

    在以前的教程你曾与一个简单的数据模型,由三个实体组成.在本教程中,您将添加更多的实体和关系,并通过指定格式. 验证和数据库映射规则,您将自定义数据模型.你会看到自定义的数据模型的两种方式: 通过添加属 ...

  7. SQL Server中使用Check约束提升性能

        在SQL Server中,SQL语句的执行是依赖查询优化器生成的执行计划,而执行计划的好坏直接关乎执行性能.     在查询优化器生成执行计划过程中,需要参考元数据来尽可能生成高效的执行计划, ...

  8. ASP.NET MVC EF 中使用异步控制器

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精   为什么使用异步操作/线程池 ASP.NET MVC ...

  9. DB表的关系及EF中Fluent API的使用

    现在使用多数的数据库是关系型数据库,那么表与表之间的关系就会显得尤其重要,对于数据的CRUD处理和以后数据的分析有很大的好处.下面是对于数据库中对表关系的理解以及在EF中使用Fluent API来创建 ...

随机推荐

  1. webpack简单教程

    1.初始化 安装node后,新建一个目录,比如html5.cmd中切到当前文件夹. npm init -y 这个命令会创建一个默认的package.json.它包含了项目的一些配置参数,通过它可以进行 ...

  2. Vue.js——快速入门

    Vue.js是当下很火的一个JavaScript MVVM库,它是以数据驱动和组件化的思想构建的.相比于Angular.js,Vue.js提供了更加简洁.更易于理解的API,使得我们能够快速地上手并使 ...

  3. 转Centos7.0进入单用户模式修改root密码

    Centos7.0进入单用户模式修改root密码   启动Centos7 ,按空格让其停留在如下界面. 按e进行编辑 在UTF-8后面输入init=/bin/sh 根据提示按ctrl+x 得如下图 输 ...

  4. 了解AOP

    Spring AOP的实现是基于JAVA的代理机制, 从JDK1.3开始就支持代理功能, 但是性能成为一个很大问题, 为了解决JDK代理性能问题, 出现了CGLIB代理机制.它可以生成字节码, 所以它 ...

  5. Codeforces Round #424 (Div. 1, rated, based on VK Cup Finals)

    A 题意:给你人的坐标,钥匙的坐标,办公室的坐标.要求所有人能够拿到钥匙并且走到办公室的最短时间.一个位置只能有一个人,一个位置只有一把钥匙,人和钥匙可以在同一个位置. 思路:DP+贪心,dp[i]表 ...

  6. Python之旅Day9 进程&线程

    进程 线程 多进程 多线程

  7. 第63节:Java中的Spring MVC简介笔记

    前言 感谢! 承蒙关照~ Java中的Spring MVC简介笔记 MVC简介 Spring MVC 基本概念 Spring MVC 项目搭建 maven 使用Spring MVC进行开发 实现数据绑 ...

  8. Python中parameters与argument区别

    定义(define)一个带parameters的函数: def addition(x,y): return (x+y) 这里的x,y就是parameter 调用addition(3,4) 调用(cal ...

  9. RISC-V平台的汇编指令解析

     csrr    a0, 0xF14 //把0xF14的值读入到a0中  andi    a1, a0, 0x1f //把a0 和0x1F按位与运算后存储到a1中 srli    a0, a0, 5 ...

  10. 什么 是JavaScript中的变量? 部分2

    变量:是计算机存储数据的标识符 js中存储数据的方式 都是使用变量 js 中声明变量的方式都是var 存储数据,应该有对应的数据类型js中的字符串类型都用成对的单引号或者双引号包裹起来 变量 1. 变 ...