我有......
'类别'
的基本定义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]。
请帮忙。