我有一个代码优先模型,我试图删除所有引用某个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();
它只删除用户表,而不是全部!
答案 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
必须有Department
,Department
有很多课程,Course
有一个名为{的外键{1}}。删除DepartmentID
时,级联删除:意味着删除该部门的所有课程(子)。这里的关系是一个部门可以有很多课程:一对多。
如果子对象具有不可为空的外键,则EF将在删除父对象时删除子对象:默认情况下将设置删除级联。如果孩子可以拥有可以为空的外键,则在删除父母时不会删除孩子。
因此,从上面我们可以看出,EF使用的删除策略取决于您如何设置模型。
您的查询会返回一个Department
。因此,如果要删除所有子项,如果以这种方式构建模型,它们将自动删除。
如果还没有,请逐个删除子项。如果用户有一个user
的孩子,请执行以下操作:
area
如果context.user.area.Remove(query.user.area);
有多个user
,请使用我上面显示的foreach策略。