2012-02-24 12 views
30

ho un modello comeEntity Framework codice 4.3 primo multiplo molti a molti utilizzando le stesse tabelle

public class User 
{ 
    [Key] 
    public long UserId { get; set; } 

    [Required] 
    public String Nickname { get; set; } 

    public virtual ICollection<Town> Residencies { get; set; } 

    public virtual ICollection<Town> Mayorships { get; set; } 
} 

e

public class Town 
{ 
    [Key] 
    public long TownId { get; set; } 

    [Required] 
    public String Name { get; set; } 

    public virtual ICollection<User> Residents { get; set; } 
    public virtual ICollection<User> Mayors { get; set; } 
} 

Speravo EF creerebbe due molti a molti rapporti utilizzando creato automaticamente Tabella TownResidents e TownMayors. Non riesco a trovare la convenzione necessaria o l'annotazione esplicita per ottenere questo risultato.

Invece sto ottenendo due FK UserIds nella tabella Town e due FK TownIds nella tabella User.

Qualche idea su come ottenere EF per vederle in due o più relazioni?

Grazie

risposta

30

Beh, EF non ha un qualche tipo di parola e algoritmo di riconoscimento di grammatica che sarebbe necessario per identificare che (probabilmente) desidera che User.Residencies e Town.Residents formare una coppia di proprietà di navigazione e User.Mayorships e Town.Mayors formare una seconda coppia. Di conseguenza, si presume che tu abbia quattro relazioni uno-a-molti e che ciascuna delle quattro proprietà di navigazione appartenga a una delle relazioni. (Questa è la ragione per le quattro chiavi esterne che avete visto nelle tabelle del database.)

Questa ipotesi standard non è ciò che si vuole, quindi, è necessario definire le relazioni in modo esplicito per ignorare questa convenzione standard:

entrambi i casi con annotazioni di dati:

public class User 
{ 
    [Key] 
    public long UserId { get; set; } 

    [Required] 
    public String Nickname { get; set; } 

    [InverseProperty("Residents")] 
    public virtual ICollection<Town> Residencies { get; set; } 

    [InverseProperty("Mayors")] 
    public virtual ICollection<Town> Mayorships { get; set; } 
} 

O dI API perfetto:

modelBuilder.Entity<User>() 
    .HasMany(u => u.Residencies) 
    .WithMany(t => t.Residents) 
    .Map(x => 
    { 
     x.MapLeftKey("UserId"); 
     x.MapRightKey("TownId"); 
     x.ToTable("TownResidents"); 
    }); 

modelBuilder.Entity<User>() 
    .HasMany(u => u.Mayorships) 
    .WithMany(t => t.Mayors) 
    .Map(x => 
    { 
     x.MapLeftKey("UserId"); 
     x.MapRightKey("TownId"); 
     x.ToTable("TownMayors"); 
    }); 

API perfetto ha il vantaggio che è possibile controllare il nam e della tabella di collegamento (e anche i nomi delle colonne chiave). Non è possibile definire quei nomi con annotazioni di dati.

+0

Grazie. Ho provato entrambi i metodi ed entrambi hanno funzionato, ma come hai detto tu il metodo Fluent ti permette di controllare il nome della tabella, quindi preferisco quel metodo. Grazie ancora. – Sean

+0

La parte Mappa non è necessaria. Il tuo codice api fluente fa il lavoro senza di esso. – ozgur

Problemi correlati