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来创建 ...
随机推荐
-
【JQ基础】数组
each() 方法规定为每个匹配元素规定运行的函数.
-
介绍编译的less的两种IDE工具
介绍编译的less的两种IDE工具 现在css预编译越来越普及了,著名的有less.sass.stylus等等等等.功能上基本上都是大同小异.这些个玩意儿主要表达的意思就是:"像编程一样的编 ...
-
SQL SERVER 索引之聚集索引和非聚集索引的描述
索引是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度. 索引包含由表或视图中的一列或多列生成的键. 这些键存储在一个结构(B 树)中,使 SQL Server 可以快速有效地查找与键值关 ...
-
FileMode文件模式
一.FileMode.Append Append追加: 如果文件存在,则打开文件,把指针指到文件的末尾:如果不存在,则新建文件 二.FileMode.Create Create:新建 如果文件存在,则 ...
-
sql查询字段值的换行及回车符
SQL的换行.回车符,在MySQL.SQL Server和Oracle中均有不同,下面以列表显示. MySQL SQL Server Oracle 换行符 \n或\r\n或CHAR(10) CHA ...
-
bzoj 2393 Cirno的完美算数教室(容斥原理+搜索)
[题意] 定义C数为只包含数字2和9的数,求[L,R]内能被C数整除的个数. [思路] Dfs预处理出C数,并去除其中倍数的情况. Dfs搜索出现情况,奇数加,偶数减,当数值大于R时剪枝. [代码] ...
-
html基本基础
一 HTML5是用来做什么的? PSD2HTML 信息 信息差(信息不对称) 二 html文件新建流程: 新建文本文件 网页文件后缀 .html 修改编码:ANSI格式,UTF-8无BOM格式==== ...
-
Java 面向对象(转)
转自:http://blog.sina.com.cn/s/blog_83c5190f01010ate.html 1.我们可以把JAVA中的类分为以下三种: 类:使用class定义且不含有抽象方法的类. ...
-
char、varchar和nvarchar的区别
首先char.varchar和nvarchar.text.ntext都是数据库中的文本数据类型,再区分区分var前缀.n前缀的区别.而text.ntext已经普遍被varchar(MAX)和nvarc ...
-
27 自定义View小结
自定义View 1 为了满足开发需要 就需要自定义View 2 分类: 直接继承View 继承View的子类(现有控件 button,TextView-.) 继承ViewGroup(线性布局 相对布局 ...