C# 如何删除没有子类别的类别

C# 如何删除没有子类别的类别,c#,entity-framework,ef-code-first,code-first,C#,Entity Framework,Ef Code First,Code First,如何删除没有子类别的类别 类别模型: 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; }

如何删除没有子类别的类别

类别模型:

   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语句与同一个表引用冲突 约束“FK_dbo.Categories_dbo.Categories_ParentId”。冲突 发生在数据库“ProjectDatabase”表“dbo.Categories”列中 “父ID”。 声明已终止

我的删除代码:

  public void Delete(int categoryId)
        {
            var category = _categories.First(d => d.Id == categoryId);
            _categories.Remove(category);
        }
类别配置:

 public class CategoryConfig : EntityTypeConfiguration<Category>
    {
        public CategoryConfig()
        {
            ToTable("Categories");
            HasOptional(x => x.Parent)
            .WithMany()
            .HasForeignKey(x => x.ParentId)
            .WillCascadeOnDelete(false);

       }
    }
公共类类别配置:EntityTypeConfiguration
{
公共类别配置()
{
ToTable(“类别”);
has可选(x=>x.Parent)
.有很多
.HasForeignKey(x=>x.ParentId)
.WillCascadeOnDelete(假);
}
}

您无法删除Id为1的类别,因为存在引用它的子类别(汤和咖啡)。在delete方法中,您必须首先将这些项的
ParentId
更改为另一个现有元素(或null),或者在删除具有
Id=1
的类别之前删除这些项,根据,Code First不会在关系上设置cascade delete(您正在显式地执行此操作),当主体被删除时,外键将设置为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);