如何删除没有子类别的类别?
类别模型:
public class Category
{
public virtual int Id{ get; set; }
public virtual string Name { get; set; }
public virtual Category Parent { get; set; }
public virtual int? ParentId { get; set; }
}
数据:
Id ParentId Name
1 null Hot
2 1 Soup
3 1 Coffee
4 3 Decaf Coffee
5 null Cold
6 5 Iced Tea
我需要使用Id=1
删除类别,但会发生以下错误:
DELETE语句与SAME TABLE REFERENCE冲突 约束“FK_dbo.Categories_dbo.Categories_ParentId”。冲突 发生在数据库“ProjectDatabase”,表“dbo.Categories”列中 'PARENTID'。 声明已经终止。
我的删除代码:
public void Delete(int categoryId)
{
var category = _categories.First(d => d.Id == categoryId);
_categories.Remove(category);
}
CategoryConfig:
public class CategoryConfig : EntityTypeConfiguration<Category>
{
public CategoryConfig()
{
ToTable("Categories");
HasOptional(x => x.Parent)
.WithMany()
.HasForeignKey(x => x.ParentId)
.WillCascadeOnDelete(false);
}
}
答案 0 :(得分:1)
您无法删除Id=1
类别,因为有一些子类别被引用( Soup 和 Coffee )。在您的删除方法中,您必须先将这些项目的ParentId
更改为另一个现有元素(或 null ),或删除这些项目,然后再删除Id=1
类别
答案 1 :(得分:0)
嗯,根据documentation,如果依赖实体上的外键是nullable
,Code First不会在关系上设置级联删除(你明确地做了),当删除主体时,外键将设置为null
。
我不知道为什么在你的情况下不这样做,可能是因为你正在使用单向关系并且你没有父类别中的子集合,所以EF无法设置FK属性为子类别中的null
,但您可以尝试以下操作:
var category = _categories.First(d => d.Id == categoryId);
var children=_categories.Where(d=>d.ParentId==categoryId);
foreach(var c in children)
c.ParentId=null;
_categories.Remove(category);