2016-03-30 40 views
1

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

分类型号:

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

DATAS:

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”,列 '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

那么,根据documentation如果在相关实体的外键是nullable,代码第一次不设置梯级上的关系(你明确地做)删除,并在主要被删除外键将被设置为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); 
1

你不能用Id=1删除类别,因为有引用到它(咖啡子类别 )。在删除方法中,您必须首先将这些项目的ParentId更改为另一个现有元素(或null)或删除这些项目,然后用Id=1删除类别。