实体框架代码优先,一对多,子代上的可选父级,级联删除

时间:2016-12-05 16:21:53

标签: c# entity-framework ef-fluent-api

我有......

'类别'

的基本定义
public abstract class BaseCategory
{
    [Key]
    public Guid Id { get; protected set; }

    public virtual List<BaseCategory> Subcategories { get; protected set; }

    public virtual BaseCategory ParentCategory { get; protected set; }

    public Guid? ParentCategoryId { get; protected set; }

    public BaseCategory(Guid id, BaseCategory parentCategory = null)
    {
        this.Id = id;

        if (parentCategory != null)
        {
            this.ParentCategory = parentCategory;
            this.ParentCategory.Subcategories.Add(this);
        }

        this.Subcategories = new List<BaseCategory>();
    }

    protected BaseCategory()
    {
    }
}

有一个&#39;用户&#39;类别,可以由用户创建。它会自动分配一个新的随机guid。 要求成为任何其他类别的孩子。

public class UserCategory : BaseCategory
{
    public UserCategory(BaseCategory parentCategory) : base(Guid.NewGuid(), parentCategory)
    {
        // The user created category always needs a parent (i.e. users cannot create new top-level categories.
        if (parentCategory == null)
        {
            throw new ArgumentNullException("parentCategory");
        }
    }

    protected UserCategory()
    {
    }
}

还有一个系统定义的类别。它可能有也可能没有父母(即它可以是一个“根”类别,没有父母)。但是,如果它具有父级,则父级必须是系统定义的类别。

public class SystemCategory : BaseCategory
{
    public SystemCategory(Guid id, SystemCategory parentCategory = null) : base(id, displayName, parentCategory)
    {
    }

    protected SystemCategory()
    {
    }
}

换句话说,我将首先构建一个系统定义类别(层次结构)的树,然后用户可以自定义&#39;它通过向树中添加用户类别叶子。

我想删除一个类别时,要删除的子类别 - 级联删除。但请注意,由于基本抽象类,对象之间的关系是可选的(用户类别强制在代码中具有父级,而不是在数据库中)。

我知道我必须使用Fluent API来配置它。我试过这个:

modelBuilder.Entity<BaseCategory>()
                .HasOptional(a => a.ParentCategory)
                .WithMany(a => a.Subcategories)
                .WillCascadeOnDelete(true);

但是当我删除带有孩子的类别时,我得到:

  

System.Data.SqlServerCe.SqlCeException:   System.Data.SqlServerCe.SqlCeException:一个外键约束   具有UPDATE或DELETE CASCADE规则,并自引用列   在同一张表中,是不允许的。 [约束名称=   FK_dbo.BaseCategories_dbo.BaseCategories_ParentCategoryId]。

请帮忙。

0 个答案:

没有答案