问题描述
我正在尝试在 db 中创建一个树结构,其中项目可以相互引用。我认为这是一项简单的任务,但是,EF Core 决定罢工。我无法让它生成正确的外键,它不断抛出异常:
Unable to determine the relationship represented by navigation 'Item.Parent' of type 'Item'. Either manually configure the relationship,or ignore this property using the '[NotMapped]' attribute or by using 'EntityTypeBuilder.Ignore' in 'OnModelCreating'.
我的类看起来像这样(简化):
public class Item
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
[ForeignKey("Parent")]
public Guid? ParentId { get; set; }
public virtual Item Parent { get; set; }
[InverseProperty("Parent")]
public virtual IEnumerable<Item> Children { get; set; }
}
我尝试过的另一件事是 Fluent API:
entity
.HasOne(e => e.Parent)
.WithMany(e => e.Children)
.HasForeignKey(e => e.ParentId);
//or
entity
.HasOne<Item>(e => e.Parent)
.WithMany()
.HasForeignKey(e => e.ParentId);
//or
entity
.HasMany(e => e.Children)
.WithOne(e => e.Parent)
.HasForeignKey(e => e.ParentId);
//or
entity
.HasMany(e => e.Children)
.WithOne(e => e.Parent);
我也在看其他一些答案,它们看起来很像我想要做的,但是,我的 EF 不会生成迁移。
解决方法
无视这个问题,我已经找出了我自己的错误。我会留在这里以防有人遇到同样的问题,因为错误信息非常具有误导性。
发生的事情是复制和粘贴问题,我为不相关的实体创建了另一个配置,但忘记更新类型:
{
public void Configure(EntityTypeBuilder<Item> entity)
{
entity
.HasNoKey();
}
}
注意泛型定义中的 Item 类型。这导致 EF Core 删除了最初在实体上设置的键,并使 EF Core 对这种关系感到困惑(因为现在我将外键定位到既不是键也不是索引的属性)。