关于EF中出现FOREIGNKEY约束可能会导致循环或多重级联路径的问题
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约束可能会导致循环或多重级联路径的问题的更多相关文章
- C# json反序列化 对象中嵌套数组 (转载) 可能会导致循环或多重级联路径。请指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。
C# json反序列化 对象中嵌套数组 (转载) 看图: 这里可以看到是二层嵌套!!使用C#如何实现?? 思路:使用list集合实现 → 建立类 → list集合 → 微软的 Newtonso ...
- EF Core 遇到“可能会导致循环或多重级联路径”
在ef core中你可能会设计这样一个实体: public class Customer : Entity,IMustHaveTenant, IHasCreationTime { public Cus ...
- 可能会导致循环或多重级联路径。请指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。
错误提示:可能会导致循环或多重级联路径.请指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束. 原因:自表连接(同一张表 ...
- EFCore的外键级联删除导致的【可能会导致循环或多重级联路径】
之前也是经常遇到这个问题,但好在每次创建的实体不多,很容易就能找到是哪个外键导致级联循环删除问题 之前都是这么处理,因为创建的实体也不多,所以还处理得来 但最近跟别人合作写后端,别人写了好多实体,我一 ...
- Entity Framework Code first 可能会导致循环或多个级联路径.
用code first映射数据库报错 Introducing FOREIGN KEY constraint 'FK_dbo.Roles_dbo.SubSystems_SubSystemID' on t ...
- EntityFramework_MVC4中EF5 新手入门教程之四 ---4.在EF中创建更复杂的数据模型
在以前的教程你曾与一个简单的数据模型,由三个实体组成.在本教程中,您将添加更多的实体和关系,并通过指定格式. 验证和数据库映射规则,您将自定义数据模型.你会看到自定义的数据模型的两种方式: 通过添加属 ...
- SQL Server中使用Check约束提升性能
在SQL Server中,SQL语句的执行是依赖查询优化器生成的执行计划,而执行计划的好坏直接关乎执行性能. 在查询优化器生成执行计划过程中,需要参考元数据来尽可能生成高效的执行计划, ...
- ASP.NET MVC EF 中使用异步控制器
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精 为什么使用异步操作/线程池 ASP.NET MVC ...
- DB表的关系及EF中Fluent API的使用
现在使用多数的数据库是关系型数据库,那么表与表之间的关系就会显得尤其重要,对于数据的CRUD处理和以后数据的分析有很大的好处.下面是对于数据库中对表关系的理解以及在EF中使用Fluent API来创建 ...
随机推荐
- peewee基本使用
PEEWEE基本使用 Content Ⅰ 安装Ⅱ 链接数据库Ⅲ 建表 Ⅳ 增删改 Ⅴ 基础查询 Ⅵ ForeignKey Ⅷ 事务 参考官方文档:http://docs.peewee-o ...
- Python 递归 Resursion()
条件: ①递归有最小值或有确定值 ②fun(x) = ax * bfun(x-1) 类似规则 eg. n! : ①1! = 1 ②n! = n* (n-1)! def factorial (n): ...
- 前端框架本质之探究——以Vue.js为例
问:我们在使用Vue时,实际上干了什么? 答:实际上只干了一件事——new了一个Vue对象.后面的事,都交由这个对象自动去做.就好像按了下开关,机器跑起来了,剩下的事就不用我们再操心了. 各位 ...
- App设计:消息推送和界面路由跳转
概要 app消息推送.显示通知栏,点击跳转页面是很一般的功能了,下面以个推为例演示push集成,消息处理模块及app内部路由模块的简单设计. 推送 推送sdk集成 集成sdk步骤根据文档一步步做就行了 ...
- Logistic回归Cost函数和J(θ)的推导----Andrew Ng【machine learning】公开课
最近翻Peter Harrington的<机器学习实战>,看到Logistic回归那一章有点小的疑问. 作者在简单介绍Logistic回归的原理后,立即给出了梯度上升算法的code:从算法 ...
- PHP全栈学习笔记18
php基础知识,JavaScript,jQuery,ajax基础知识 linux基础知识,mysql数据库的基础与优化 程序设计,PHP框架基础知识,算法,逻辑思维,高并发 PHP基础知识 引用变量, ...
- 第87节:Java中的Bootstrap基础与SQL入门
第87节:Java中的Bootstrap基础与SQL入门 前言复习 什么是JQ? : write less do more 写更少的代码,做更多的事 找出所有兄弟: $("div" ...
- Java-redis-雪崩优化
缓存失效的时候如下图: 解决办法"使用互斥锁(mutex key):下面是核心伪代码 v = memcache.get(key); if (v == null) { if (memcache ...
- dpkg: 处理软件包 qjackctl (--configure)时出错解决方法
第一步:备份 $ sudo mv /var/lib/dpkg/info /var/lib/dpkg/info.bk 第二步:新建 $ sudo mkdir /var/lib/dpkg/info 第三步 ...
- AI - 概念(Concepts)
01 - AI.ML与DL的关系 从涵盖范围上来讲,人工智能(AI)大于机器学习(ML)大于深度学习(DL) 人工智能(AI):能够感知.推理.行动和适应的程序: 机器学习(ML):能够随着数据量的增 ...