0

我想使用ONLY數據註釋來映射多對多關係,所以這是我的情況。EF CF通過數據註釋的m-to-n關係

說我有如下表

Foo: 
FooId int identity 
FooName varchar(max) not null 

Bar: 
BarId int identity 
BarName varchar(max) not null 

FooBarRelationships 
TheBarId int 
TheFooId int 

正如你可以看到結表包含源不同FK名稱。此外,該表的名稱也不同

我的類如下

[Table("Foo")] 
public class Foo { 
    [Key] 
    public Int32 FooId { get; set; } 
    public String FooName { get; set; } 

    public IEnumerable<Bar> Bars { get; set; } 
} 

[Table("Bar")] 
public class Bar { 
    [Key] 
    public Int32 BarId { get; set; } 
    public String BarName { get; set; } 

    public IEnumerable<Foo> Foos { get; set; } 
} 

我應該如何才能利用數據註解來告訴表FooBarRelationships是結合表和TheBarId是修改我的課來自Bar表的外鍵和TheFooId的外鍵是Foo表中的外鍵?

P.S.

將導航屬性聲明爲IEnumerable<T>,而不是ICollection<T>是必不可少的。

我試着使用地圖類,它看起來如下

public class BarMap : EntityTypeConfiguration<Bar> { 
    public BarMap() { 
     this.HasMany(t => t.Foos) 
      .WithMany(t => t.Bars) 
      .Map(m => { 
       m.ToTable("FooBarRelationships"); 
       m.MapLeftKey("TheBarId"); 
       m.MapRightKey("TheFooId"); 
      }); 
    } 
} 

這給了我下面的錯誤映射。

的類型參數方法「System.Data.Entity.ModelConfiguration.EntityTypeConfiguration <酒吧> .HasMany <TTargetEntity>(System.Linq.Expressions.Expression < System.Func <酒吧,ICollection的<TTargetEntity> > > )'不能從使用情況中推斷出來。嘗試明確指定類型參數。

如果在不改變IEnumeralbe<T>ICollection<T>的類型的情況下解決此錯誤的方法也受到歡迎。

回答

1

我不認爲你可以使用IEnumerable,因爲實體框架需要可以分配的對象。

Are IEnumerable collection supported in EF 4.1 for mapping?

你應該從另一個角度攻擊的問題。

最後一部分:

可以使用InverseAttribute在您的收藏兩側申報多對多的關係。

[Table("Foo")] 
public class Foo { 
    [Key] 
    public Int32 FooId { get; set; } 
    public String FooName { get; set; } 
    [InverseAttribute("Foos")] 
    public ICollection<Bar> Bars { get; set; } 
} 

[Table("Bar")] 
public class Bar { 
    [Key] 
    public Int32 BarId { get; set; } 
    public String BarName { get; set; } 
    [InverseAttribute("Bars")] 
    public ICollection<Foo> Foos { get; set; } 
} 
+0

謝謝您的回覆。我恢復了ICollection,並以不破壞內涵的方式重組瞭解決方案。你能回答問題的第一部分,關於提供表格元數據而不使用流利的API,只是dataannotations? – Oybek

1

如果你不使用流利的映射,你必須使用聯接表通過應該是這樣的默認約定預期的名稱和它的列:FooBars與列Foo_FooIdBar_BarId

另外,作爲由@Inu IEnumerable在答覆中提到,不支持 - 至少lazy loading proxies demandICollection,我幾乎可以肯定,這是全球性的需求(如鏈接答覆中提到)。代碼第一次通常會跳過映射的所有IEnumerable屬性。即使它是某種支持IEnumerable只是一個接口,在後面會有一些類如Collection,HashSetList因此暴露枚舉不會限制使用您的實體將導航屬性轉換爲該集合類的代碼。