2015-04-04 12 views
24

Come utilizzare l'API Fluent per creare una relazione molti a molti tra due tabelle in EF7 EF Core? Per esempio, supponiamo di avere le seguenti tabelle:Come creare una relazione molti a molti con le ultime build notturne di EF Core?

Photos to People database diagram

come si potrebbe sfruttare il ModelBuilder nella classe DbContext per definire un rapporto come questo?

ho visto this collegamento dalle note di riunione della squadra EF su questo argomento, ma è dall'anno scorso e mi chiedo se ci sono nuove informazioni su come affrontare questo EF7 EF Nucleo.

Sono in grado di creare uno a molti rapporti tra Foto e PhotosPeople così come People e PhotosPeople. Il database è generato come mi piacerebbe che fosse, ma la navigazione tra Persone e Foto ora richiede l'interazione con un'entità intermedia. Mi piacerebbe evitare questo.

risposta

43

Monitorato da #1368. La soluzione è mappare la tabella di join ad un'entità:

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; } 
} 

Accertarsi di configurare PersonPhoto con una chiave composta:

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

Per navigare, utilizzare un Select:

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

Quando provo a eseguire la migrazione, viene indicato: Microsoft.Data.Entity.Metadata.ModelItemNotFoundException: il tipo di entità "PersonPhoto" richiede una chiave da definire. – Olle

+3

Da qui la mia nota nel codice. Configuralo usando 'modelBuilder.Entity () .Key (x => new {x.PhotoId, x.PersonId});' – bricelam

+1

Ohh. Grande. Grazie bricelam. Scusa per non aver prestato attenzione. Grazie. – Olle