关于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来创建 ...
随机推荐
- 【python-appium】模拟手机按键搜索异常
执行代码的过程中运行self.driver.press_keycode(84)设备没反映,则需要关闭#desired_caps["unicodeKeyboard"] = " ...
- python 初级重点
关于python初学时遇到的重点: 1 python 2 和3 的区别 python2**不识别中文** -*- coding: utf-8 -*-(因为不能识别中文,所以代码有中文时需要在最前面加入 ...
- Redisson碰到的问题
最近开发环境使用redisson(版本是2.8.0),在部署一段时间(半个小时左右),获取分布式锁会报超时异常(org.redisson.client.RedisTimeoutException: R ...
- 漫谈PHP组件、框架、Composer那些事
什么是组件 组件是一组打包的代码,是一系列相关的类.接口和Trait,用于帮助我们解决PHP应用中某个具体问题.例如,你的PHP应用需要收发HTTP请求,可以使用现成的组件如guzzle/guzzle ...
- Python - Fabric简介
1 - Fabric Fabric是一个Python的库,提供了丰富的同SSH交互的接口,可以用来在本地或远程机器上自动化.流水化地执行Shell命令. 非常适合用来做应用的远程部署及系统维护.简单易 ...
- Python 游戏之旅(Pygame)
Pygame是跨平台Python模块,专为电子游戏设计,包含图像.声音.建立在SDL基础上,允许实时电子游戏研发而无需被低级语言(如机器语言和汇编语言)束缚.基于这样一个设想,所有需要的游戏功能和理念 ...
- yolo_v3训练自己的模型(人脸及deep-sort)
做deep-sort多目标跟踪需要结合yolo_v3进行检测行人 由于我的项目中需要对人脸进行检测,所以需要训练针对人脸的模型 训练样本是来自WIDER-FACE人脸库.(有3w+的图片和标注框) d ...
- 关于sql和MySQL的语句执行顺序(必看!!!)
今天遇到一个问题就是mysql中insert into 和update以及delete语句中能使用as别名吗?目前还在查看,但是在查阅资料时发现了一些有益的知识,给大家分享一下,就是关于sql以及My ...
- tensorflow 1.0 学习:池化层(pooling)和全连接层(dense)
池化层定义在 tensorflow/python/layers/pooling.py. 有最大值池化和均值池化. 1.tf.layers.max_pooling2d max_pooling2d( in ...
- shell变量定义与数组-1
1.查看系统所有shell和默认shell 查看系统所有的shell: cat /etc/shells 查看系统默认shell: echo $SHELL 2.第一个shell脚本,打印字符串Hello ...