代码之家  ›  专栏  ›  技术社区  ›  Rickard Liljeberg

如何在EF5中删除父级时为空自引用fk-代码优先

  •  0
  • Rickard Liljeberg  · 技术社区  · 11 年前

    我有一个问题实体。我的实体包含一个类型为Question的CreatedFrom,该类型包含对创建它的问题的引用。所以是自我参考。

    现在,只要原始问题存在,我就使用CreatedFrom来更新它。但用户可以删除原始问题,使我的问题成为“孤立问题”。然而,这是完全可以的,因为这是系统的设计。

    现在我将这一行添加到我的DbContext中:

    modelBuilder.Entity<Question>().HasOptional(x => x.CreatedFrom);
    

    但它仍然拒绝让我删除“父母”,说关系是阻碍。

    我想要的是能够删除父级,并且当我这样做时,对于任何将CreatedFrom设置为现在已删除问题的ID的问题,CreatedProm都应该为null。

    1 回复  |  直到 11 年前
        1
  •  1
  •   Slauma    11 年前

    您必须将儿童问题加载到上下文中。如果删除父EF,则应设置引用 CreatedFrom 对于所有附属的孩子 null 并将其保存为数据库的UPDATE:

    using (var context = new MyContext())
    {
        var parentQuestion = context.Questions
            .SingleOrDefault(q => q.Id == someId);
    
        if (parentQuestion != null)
        {
            context.Questions
                .Where(q => q.CreatedFrom.Id == someId)
                .Load();
    
            context.Questions.Remove(parentQuestion);
            context.SaveChanges();
        }
    }
    

    如果你有 ChildQuestions 中的集合属性 Question 您可以通过添加 Include(q => q.ChildQuestions) 到的查询 parentQuestion 并移除显式加载子级的查询。