4

在这种关联中,我收到错误“无法确定类型 'Foo' 和 'Bar' 之间关联的主体端。必须使用关系流式 API 或数据注释显式配置此关联的主体端。 "

public class Foo
{
    public int Id { get; set; }

    public int? MainBarId { get; set; }
    public virtual Bar MainBar { get; set; }

    [InverseProperty("Foo")]
    public virtual ICollection<Bar> Bars { get; set; }
}

public class Bar
{
    public int Id { get; set; }

    public int FooId { get; set; }
    public virtual Foo Foo { get; set; }

    public int? OldFooId { get; set; }
    public virtual Foo OldFoo { get; set; }
}

这里 Foo 有一个 Bars 的集合,并且可以有一个主 Bar (MainBar)。Bar 总是与 Foo 相关联,但可以引用另一个 Foo (OldFoo)。

  1. 如何使用数据注释在 EF 中映射它?
  2. 如果无法使用数据注释,那么如何使用流利的方式做到这一点?
4

1 回答 1

7

通过[InverseProperty("Foo")]您告诉 EFBar.Foo并且Foo.Bars是一对多关联中的成对属性,这很清楚。

然后有Foo.MainBarBar.OldFoo。EF 不知道这些是如何相关的。它们可以以一对一的关联配对,它们可以是独立的,即在另一侧具有“多”多重性。所以你必须告诉EF。

我假设属性是独立的,即 aBar可以具有 aOldFoo而无需同时要求 thisBarFoo's MainBar。然后,提供有关以下属性之一的 EF 信息就足够了:

modelBuilder.Entity<Bar>().HasOptional(f => f.OldFoo).WithMany()
    .HasForeignKey(f => f.OldFooId);

或者

modelBuilder.Entity<Foo>().HasOptional(f => f.MainBar)
    .WithRequired(b => b.OldFoo)

由于没有与关联的这些“一个”端配对的反向属性,因此您无法使用数据注释来执行此操作(没有属性可以用属性装饰)。

于 2013-05-13T21:32:49.947 回答