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

时间:2023-01-15 22:10:09

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&num; json反序列化 对象中嵌套数组 &lpar;转载&rpar; 可能会导致循环或多重级联路径。请指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。

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

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

    在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 可能会导致循环或多个级联路径&period;

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

  6. EntityFramework&lowbar;MVC4中EF5 新手入门教程之四 ---4&period;在EF中创建更复杂的数据模型

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

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

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

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

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

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

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

随机推荐

  1. 【JQ基础】数组

    each() 方法规定为每个匹配元素规定运行的函数.

  2. 介绍编译的less的两种IDE工具

    介绍编译的less的两种IDE工具 现在css预编译越来越普及了,著名的有less.sass.stylus等等等等.功能上基本上都是大同小异.这些个玩意儿主要表达的意思就是:"像编程一样的编 ...

  3. SQL SERVER 索引之聚集索引和非聚集索引的描述

    索引是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度. 索引包含由表或视图中的一列或多列生成的键. 这些键存储在一个结构(B 树)中,使 SQL Server 可以快速有效地查找与键值关 ...

  4. FileMode文件模式

    一.FileMode.Append Append追加: 如果文件存在,则打开文件,把指针指到文件的末尾:如果不存在,则新建文件 二.FileMode.Create Create:新建 如果文件存在,则 ...

  5. sql查询字段值的换行及回车符

    SQL的换行.回车符,在MySQL.SQL Server和Oracle中均有不同,下面以列表显示.   MySQL SQL Server Oracle 换行符 \n或\r\n或CHAR(10) CHA ...

  6. bzoj 2393 Cirno的完美算数教室(容斥原理&plus;搜索)

    [题意] 定义C数为只包含数字2和9的数,求[L,R]内能被C数整除的个数. [思路] Dfs预处理出C数,并去除其中倍数的情况. Dfs搜索出现情况,奇数加,偶数减,当数值大于R时剪枝. [代码] ...

  7. html基本基础

    一 HTML5是用来做什么的? PSD2HTML 信息 信息差(信息不对称) 二 html文件新建流程: 新建文本文件 网页文件后缀 .html 修改编码:ANSI格式,UTF-8无BOM格式==== ...

  8. Java 面向对象&lpar;转&rpar;

    转自:http://blog.sina.com.cn/s/blog_83c5190f01010ate.html 1.我们可以把JAVA中的类分为以下三种: 类:使用class定义且不含有抽象方法的类. ...

  9. char、varchar和nvarchar的区别

    首先char.varchar和nvarchar.text.ntext都是数据库中的文本数据类型,再区分区分var前缀.n前缀的区别.而text.ntext已经普遍被varchar(MAX)和nvarc ...

  10. 27 自定义View小结

    自定义View 1 为了满足开发需要 就需要自定义View 2 分类: 直接继承View 继承View的子类(现有控件 button,TextView-.) 继承ViewGroup(线性布局 相对布局 ...