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);
            }
        }

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

  • 相关阅读:
    PAT Advanced 1067 Sort with Swap(0, i) (25分)
    PAT Advanced 1048 Find Coins (25分)
    PAT Advanced 1060 Are They Equal (25分)
    PAT Advanced 1088 Rational Arithmetic (20分)
    PAT Advanced 1032 Sharing (25分)
    Linux的at命令
    Sublime Text3使用指南
    IntelliJ IDEA创建第一个Groovy工程
    Sublime Text3 安装ftp插件
    Sublime Text3配置Groovy运行环境
  • 原文地址:https://www.cnblogs.com/ldybyz/p/7145574.html
Copyright © 2011-2022 走看看