2015-04-04 102 views
24

如何使用Fluent API在 EF7 EF Core中的兩個表格之間創建多對多關係?例如,假設你有如下表:如何與最新的EF核心版本建立多對多的關係?

Photos to People database diagram

一個怎樣利用模型構建器中的DbContext類來定義這樣的關係?

我見過從EF團隊的會議記錄對於這個問題this鏈接,但它是從去年開始,我想知道是否有關於如何在 EF7 EF核心處理這一新的信息。

我能夠在Photos和PhotosPeople以及People和PhotosPeople之間創建一對多的關係。數據庫按我的意願生成,但People和Photos之間的導航現在需要與中間實體進行交互。我想避免這種情況。

回答

43

這個跟蹤#1368。解決方法是映射連接表的實體:

class Photo 
{ 
    public int Id { get; set; } 
    public ICollection<PersonPhoto> PersonPhotos{ get; set; } 
} 

class PersonPhoto 
{ 
    public int PhotoId { get; set; } 
    public Photo Photo { get; set; } 

    public int PersonId { get; set; } 
    public Person Person { get; set; } 
} 

class Person 
{ 
    public int Id { get; set; } 
    public ICollection<PersonPhoto> PersonPhotos{ get; set; } 
} 

一定要具有複合鍵配置PersonPhoto

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<PersonPhoto>().HasKey(x => new { x.PhotoId, x.PersonId }); 
} 

要進行導航,使用一個選擇:

// person.Photos 
var photos = person.PersonPhotos.Select(c => c.Photo); 
+0

當我嘗試運行遷移它說:Microsoft.Data.Entity.Metadata.ModelItemNotFoundException:實體類型'PersonPhoto'需要一個鍵來定義。 – Olle 2015-06-17 18:53:24

+3

因此我在代碼中說明。使用'modelBuilder.Entity ().Key(x => new {x.PhotoId,x.PersonId});' – bricelam 2015-06-18 15:22:14

+1

Ohh來配置它。大。感謝bricelam。對不起,不注意。謝謝。 – Olle 2015-06-18 19:29:58