我在尝试在 Entity Framework 6.1 中创建递归关系时遇到了很大的问题。
我需要一些不同类型的类别,但已经为所有类别创建了一个“基础”抽象类。我正在使用 Table-Per-Type 分层策略。类别可能有也可能没有 ParentCategory。(如果不是,那么它是一个顶级类别)
在下面的代码中,我展示了如何创建抽象 Category 类以及 ParentCategory 和 ChildCategories 导航属性。我已将 ParentCategoryId 设为可为空,因为在顶级类别的情况下不需要它。我已经看到了一些正是我想要在这里实现的帖子,虽然我认为我已经解决了所有答案,但我仍然收到以下错误:
Category_ParentCategory::多重性与关系“Category_ParentCategory”中角色“Category_ParentCategory_Target”中的引用约束冲突。因为从属角色中的所有属性都不可为空,所以主体角色的多重性必须为“1”。
我想知道它是否与 Category 作为抽象类和我正在使用的添加的继承模型有关,因为我在其他任何关于这种递归关系的帖子中都没有看到确切的用法。任何帮助表示赞赏!
public abstract class Category : ICategory
{
protected Category()
{
ChildCategories = new HashSet<Category>();
}
public int CategoryId { get; private set; }
public int? ParentCategoryId { get; set; }
public virtual Category ParentCategory { get; set; }
public virtual ICollection<Category> ChildCategories { get; set; }
}
public class WLCategory : Category, IWLCategory
{
public WLCategory() : base()
{
DynamicFields = new HashSet<DynamicFieldDef>();
}
public virtual ICollection<DynamicFieldDef> DynamicFields { get; set; }
}
使用 FluentAPI,我已将数据库创建配置为:
class CategoriesConfig : EntityTypeConfiguration<Category>
{
public CategoriesConfig()
{
HasOptional(p => p.ParentCategory).WithMany(p => p.ChildCategories)
.HasForeignKey(p => p.ParentCategoryId);
ToTable("Categories");
}
}
class WLCategoriesConfig : EntityTypeConfiguration<WLCategory>
{
public WLCategoriesConfig()
{
HasKey(p => p.CategoryId);
ToTable("WLCategories");
}
}