实体框架Code First with Migrations Cascade Delete无法正常工作

时间:2016-12-08 23:14:50

标签: c# entity-framework-6

我有一个代码优先模型,我试图删除所有引用某个ID的行,问题是,它在我使用迁移之前工作。这是我的代码:

var query = context.user.Include(p => p.area).
                    Include(p => p.city).Include(p => p.city.state).
                    Include(p => p.city.state.country).
                    Include(p => p.favorites).Include(p => p.ads).FirstOrDefault(a => a.id_user == result);

                context.user.Remove(query);
                context.Entry(query).State = EntityState.Deleted;
                context.SaveChanges();

它只删除用户表,而不是全部!

1 个答案:

答案 0 :(得分:0)

为用户启用级联删除操作,因此当删除时,其所有子项也将被删除。像这样:

modelBuilder.Entity<user>()
            .WillCascadeOnDelete(true); 

如果您不想这样,可以像这样使用RemoveRange

context.user.RemoveRange(query);

或者你可以遍历每个孩子并单独删除它们:

foreach (var record in context.user.area)
{
    user.area.Remove(record);
}

最后,您可以删除其中一个包含,因为您不需要它。

var query = context.user.Include(p => p.area).
                    Include(p => p.city.state.country).
                    Include(p => p.favorites).Include(p => p.ads).FirstOrDefault(a => a.id_user == result);

编辑1

我不确定您的实体之间建立了什么样的关系。删除父项时,WillCascadeOnDelete(true)应删除子项。这是一个例子:

modelBuilder.Entity<Course>() 
    .HasRequired(t => t.Department) 
    .WithMany(t => t.Courses) 
    .HasForeignKey(d => d.DepartmentID) 
    .WillCascadeOnDelete(true);

上述内容是:Course必须有DepartmentDepartment有很多课程,Course有一个名为{的外键{1}}。删除DepartmentID时,级联删除:意味着删除该部门的所有课程(子)。这里的关系是一个部门可以有很多课程:一对多。

如果子对象具有不可为空的外键,则EF将在删除父对象时删除子对象:默认情况下将设置删除级联。如果孩子可以拥有可以为空的外键,则在删除父母时不会删除孩子。

因此,从上面我们可以看出,EF使用的删除策略取决于您如何设置模型。

您的查询会返回一个Department。因此,如果要删除所有子项,如果以这种方式构建模型,它们将自动删除。

如果还没有,请逐个删除子项。如果用户有一个user的孩子,请执行以下操作:

area

如果context.user.area.Remove(query.user.area); 有多个user,请使用我上面显示的foreach策略。