我正在尝试使用 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);
});
});
});
}
请注意,一个 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,但我显然没有。有人可以帮我吗?我不知道该怎么办。
答案 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
它不提供特定问题的答案。但提供了可能绕过问题的替代方案。