c# - 如何删除没有子类别的类别

标签 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 的类别,但出现以下错误:

The DELETE statement conflicted with the SAME TABLE REFERENCE constraint "FK_dbo.Categories_dbo.Categories_ParentId". The conflict occurred in database "ProjectDatabase", table "dbo.Categories", column 'ParentId'. The statement has been terminated.

我的删除代码:

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

       }
    }

最佳答案

嗯,根据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);

关于c# - 如何删除没有子类别的类别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36311663/

相关文章:

c# - 找不到网络路径。提供程序 : Named Pipes Provider, 错误:40 - 无法打开与 SQL Server 的连接

c# - 如何使用 EF Core 2.1 和 Pomelo 创建 CreatedOn 和 UpdatedOn

linq - 如何计算嵌套集合/代码优先 Entity Framework 中的项目

c# - 连接mysql和c#

c# - 如何使用 C# 删除 "In Use"的 SQl Server 数据库?

c# - 如何使用子页面的 javascript 调用父页面的 TextChanged 事件?

c# - 按多个相关实体计数的 Entity Framework 顺序 - 效率

c# - 属性名称 'ProductId' 已定义

c# - 字符串中的字母替换

database - Entity Framework 6 复合键(DateTime + 外键)