2013-05-13 53 views
4

在这种关联关系我得到的错误“无法确定类型‘富’和‘酒吧’之间的关联的主要终点的主要结束。该协会的主要终点必须是使用关系流畅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; } 
} 

这里美孚有酒吧的集合,可以有一个主要酒吧(MainBar)。酒吧总是与Foo相关联,但可以引用另一个Foo(OldFoo)。

  1. 如何使用数据注释在EF中映射它?
  2. 如果Data Annotations不可行,如何用流利做到这一点?

回答

7

通过[InverseProperty("Foo")]你告诉EF这Bar.FooFoo.Bars在一个一对多关联配对的特性,因此是十分明显的。

再就是Foo.MainBarBar.OldFoo。英孚不知道这些是如何相关的。他们可能被配对成一对一的关系,他们可以是独立的,即在另一方面具有“多”多样性。所以你必须告诉EF。

我假定特性是独立的,即,一个Bar可以具有OldFoo没有,这是BarFoo“在同一时间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) 

因为有你可以在协会的这些“一”末端配对没有逆性”用数据注释做这件事(没有属性可以用属性装饰)。