关于EF中出现FOREIGNKEY约束可能会导致循环或多重级联路径的问题
2017-07-10 15:47
197 查看
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); } }
如有描述不对的地方,请在评论中指出。
相关文章推荐
- Entity Framework 使用Code First 处理多个表关系时的错误 “将 FOREIGN KEY 约束 'FK_dbo.' 引入表 ' ' 可能会导致循环或多重级联路径”
- C# json反序列化 对象中嵌套数组 (转载) 可能会导致循环或多重级联路径。请指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。
- 可能会导致循环或多重级联路径。请指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。
- 重定向和转发路径问题的细节部分【shiro出现循环重定向问题】
- 关于在Log4j中使用JDBCAppender时出现死循环的问题
- 关于navigationBar隐藏导致pop时出现黑条或其他颜色条的问题
- 关于使用ISA代理导致一些网上银行出现不能正常打开的问题
- 关于EF创建数据库出现“用户代码未处理”的问题
- 关于textarea标签输出数据库数据时出现大量空格导致格式不一致的问题
- 关于最近出现的病毒导致桌面无法显示的问题
- 关于一对多的关联关系 spring json出现死循环的问题
- 关于presentViewController可能会出现的问题
- 关于今天写Flex视频循环播放所出现的sdk问题
- 关于PC套件显示红外连接出现问题而导致连接不上的解决方案(zz)
- 关于WebView因图片太大导致出现横向滚动条问题
- 关于XML字符串中出现非法字符导致解析出错的问题
- 关于include标签导致js路径找不到的问题分析及解决
- 关于Eclipse中的 Source Folder导致的路径问题
- EF实体生成关系导致相互循环取数据出现异常"Self referencing loop detected for property "
- 关于include标签导致js路径找不到的问题