如何在EF5中删除父项时自动引用fk - 代码优先

时间:2013-09-21 11:38:55

标签: entity-framework ef-code-first foreign-keys entity-framework-5 cascading-deletes

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

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

现在我将此行添加到我的DbContext:

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

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

我想要的是能够删除父级,并且当我执行CreatedFrom时,应该将任何将CreatedFrom设置为现在已删除的问题的ID的问题为空。

1 个答案:

答案 0 :(得分:1)

您必须将子问题加载到上下文中。如果删除父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来简化此操作,并删除明确加载子项的查询