无法确定关联的主要结束

Max*_*hen 4 entity-framework

在这种关联中,我得到错误"无法确定类型'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; }
}
Run Code Online (Sandbox Code Playgroud)

这里的Foo有一系列Bars,可以有一个主Bar(MainBar).Bar始终与Foo相关联,但可以引用另一个Foo(OldFoo).

  1. 如何在EF中使用数据注释将其映射?
  2. 如果数据注释不可能,如何用流利的方式做到这一点?

Ger*_*old 7

通过[InverseProperty("Foo")]你告诉EF,Bar.Foo并且Foo.Bars是一对多关联中的配对属性,所以很清楚.

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

我假设性质是独立的,即一个Bar可以有一个OldFoo没有这个要求BarFooMainBar在同一时间.然后,它足以提供有关其中一个属性的EF信息:

modelBuilder.Entity<Bar>().HasOptional(f => f.OldFoo).WithMany()
    .HasForeignKey(f => f.OldFooId);
Run Code Online (Sandbox Code Playgroud)

要么

modelBuilder.Entity<Foo>().HasOptional(f => f.MainBar)
    .WithRequired(b => b.OldFoo)
Run Code Online (Sandbox Code Playgroud)

由于没有与关联的这些"一"端配对的逆属性,因此无法使用数据注释(没有用属性装饰的属性).