尽管已定义,但缺少关系定义的错误消息

时间:2020-12-21 12:54:17

标签: c# entity-framework .net-core entity-framework-core

我正在尝试使用 EF Core 建立一个新项目。为了定义我的实体之间的关系,我使用了 OnModelCreating 事件:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Article>(article =>
    {
        article.OwnsOne(e => e.Category);
        article.OwnsOne(e => e.CurrentCondition, condition =>
        {
            condition.OwnsMany(e => e.CriteriaConditions, articleCriteriaCondition =>
            {
                articleCriteriaCondition.OwnsOne(e => e.Criteria, criteria =>
                {
                    criteria.OwnsMany(e => e.CriteriaOptions, criteriaOption =>
                    {
                        criteriaOption.OwnsOne(e => e.FollowUp);
                    });
                });
            });
            condition.OwnsOne(e => e.CurrentCategory);
        });
    });

    modelBuilder.Entity<Department>(department =>
    {
        department.OwnsMany(e => e.Categories);
        department.OwnsMany(e => e.CriteriaCatalogues, criteriaCatalogue =>
        {
            criteriaCatalogue.OwnsMany(e => e.Criterias, criteria =>
            {
                criteria.OwnsMany(e => e.CriteriaOptions, criteriaOption =>
                {
                    criteriaOption.OwnsOne(e => e.FollowUp);
                });
            });
            criteriaCatalogue.OwnsMany(e => e.CriteriaCatalogues);
        });
        department.OwnsMany(e => e.Criterias, criteria =>
        {
            criteria.OwnsMany(e => e.CriteriaOptions, criteriaOption =>
            {
                criteriaOption.OwnsOne(e => e.FollowUp);
            });
        });
    });
}

这是一个类图,可以粗略地看出我的意图:Class diagram

请注意,一个 CriteriaCatalogue 可以包含许多其他 CriteriaCatalogue

现在尝试运行 Database.EnsureDeleted(); 时,我收到此错误消息:

System.InvalidOperationException: 'The entity type 'ArticleCriteriaCondition.Criteria#Criteria' is configured as owned, but the entity type 'Department.CriteriaCatalogues#CriteriaCatalogue.Criterias#Criteria.CriteriaOptions#CriteriaOption.FollowUp#Criteria' is not. All entity types sharing a CLR type must be configured as owned.'

虽然我认为我确实正确配置了我的 FollowUp,但我显然没有。有人可以帮我吗?我不知道该怎么办。

1 个答案:

答案 0 :(得分:1)

根据我的评论,我不熟悉您用于创建关系的语法(所以我不知道好处)。我发现这种方式更容易理解,但这可能是我的失败。

我会在整个过程中单独设置您的关系,但举个例子。 CurrentCondition 模型/表。这假设 CurrentCondition 有一个名为 Id 的主键和一个名为 CurrentConditionId 的外键

modelBuilder.Entity<CurrentCondition>()
            .HasOne(parentCondition => parentCondition.CurrentCondition)
            .WithMany(childCondition => childCondition.CurrentConditions)
            .HasForeignKey(parentCondition => parentCondition.CurrentConditionId)
            .HasPrincipalKey(childCondition => childCondition.Id)
            .OnDelete(DeleteBehavior.NoAction); // specify your deletebehaviour

它不提供特定问题的答案。但提供了可能绕过问题的替代方案。