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

时间:2016-03-30 14:20:24

标签: 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; }
    }

数据:

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);

       }
    }

2 个答案:

答案 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);