您的位置:首页 > 其它

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

 

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐