使用EF Code First进行级联删除(可能为空)集合

时间:2014-01-08 20:39:50

标签: c# entity-framework ef-code-first

我有这堂课:

public class Participant
  {
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Required]
    public virtual PersonName Name { get; set; }

    public virtual ICollection<ResponseSet> SurveyResponses { get; set; }
  }

首次创建参与者时,不会有任何调查回复(因此我认为答案不是要求此收集)。但是,如果删除参与者,我想在SurveyResponses中对所有ResponeSets进行级联删除。我把它添加到我的DbContext:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
      {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<Participant>()
                    .HasOptional(d=>d.SurveyResponses)
                    .WithMany()
                    .WillCascadeOnDelete();
      }

但这不太有用。是的,它创建了级联删除。但它只是在Participants表上添加了SurveyResponses_Id FK。除非我遗漏了一些不是我想要做的事情,因为参与者可以在集合中拥有多个ResponseSet。

不幸的是,我已经找到了很多这个问题的答案,但它们似乎都没有处理过这些问题。

1 个答案:

答案 0 :(得分:1)

首先,人与响应调查之间的关系是1:n。因为人的外键必须在Response调查表中。集合调查响应只是一个导航属性,并且在数据库中没有真正的列表示。

modelBuilder.Entity<ResponseSet>()
        .HasRequired(s =>s.Participant)
        .WithMany(s =>s.SurveyResponses)
        .Map(s =>s.MapKey("ParticipantId"))
        .WillCascadeOnDelete(true);