0

我在尝试在 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");
    }
}
4

1 回答 1

0

好的,找到问题了!在我的 OnModelCreating 方法中,我设置了一些全局配置,其中之一是:

 modelBuilder.Properties().Configure(p => p.IsRequired());

我想将所有属性默认设置为不可为空,除非我明确地逐个类地覆盖属性。但是,我不认为此全局设置适用于以下数据类型:

int? (nullable int)

显然,我错了。(不知道为什么 EF 会尝试使数据库中的可空 int 不可为空,即使开发人员在全局范围内设置了 IsRequired。int? 的固有含义是“可空的”。)我必须将以下代码行显式添加到我的在 HasOptional 语句之前的 CategoriesConfig 类:

 Property(p => p.ParentCategoryId).IsOptional();

现在,一切都很好。:-)

于 2014-09-08T23:40:11.827 回答