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); } }
若有描述不對的地方,請在評論中指出。