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

ef中,咱们建立外键的时候须要注意,不然会出现标题所示问题。ui

例:有项目表,项目收藏表,用户表this

项目表有以下字段:ProjectId,InputPersonId等spa

项目收藏表有以下字段:ProjectId,UseId等code

用户表有以下字段:用户id等blog

项目表:it

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

        }
    }

项目收藏表:io

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

用户表:class

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

 

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

相关文章
相关标签/搜索