zoukankan      html  css  js  c++  java
  • 关于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);
            }
        }

    如有描述不对的地方,请在评论中指出。

  • 相关阅读:
    python学习day02
    鼓起勇气 大胆说不
    spring系列---- spring-mvc1
    win7-64位 jdk安装
    项目分层以及阶段期限规划
    老油条之记
    论软件与管理的关系---企业管理软件的末路
    软件项目管理之觞
    世界在变化-----谷歌不安全
    LPR利率与固定利率哪个更合算?
  • 原文地址:https://www.cnblogs.com/ldybyz/p/7145574.html
Copyright © 2011-2022 走看看