2011-11-15 5 views
19

Sono nuovo di EF e sto cercando di ottenere una relazione unidirezionale molti-a-molti con il primo approccio al codice. Ad esempio, se ho seguito due classi (non il mio modello reale) con una relazione N * N tra di esse, ma nessuna proprietà di navigazione dal lato "Cliente".realizzazioni unidirezionali many-to-many con Code First Entity Framework

public class User { 
    public int UserId { get; set; } 
    public string Email { get; set; } 
    public ICollection TaggedCustomers { get; set; } 
} 
public class Customer { 
    public int CustomerId { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
}

Il codice di mappatura sembra ...

modelBuilder.Entity() 
     .HasMany(r => r.TaggedCustomers) 
     .WithMany(c => c.ANavgiationPropertyWhichIDontWant) 
     .Map(m => 
     { 
      m.MapLeftKey("UserId"); 
       m.MapRightKey("CustomerId"); 
       m.ToTable("BridgeTableForCustomerAndUser"); 
     });

Questa sintassi costringermi ad avere "withmany" per l'entità "Cliente". Il seguente numero url, dice "Per convenzione, Code First interpreta sempre una relazione unidirezionale come uno-a-molti".

È possibile sovrascriverlo o dovrei utilizzare un altro approccio?

risposta

35

Utilizzare questa:

public class User { 
    public int UserId { get; set; } 
    public string Email { get; set; } 
    // You must use generic collection 
    public virtual ICollection<Customer> TaggedCustomers { get; set; } 
} 

public class Customer { 
    public int CustomerId { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

e mappa con:

modelBuilder.Entity<User>() 
    .HasMany(r => r.TaggedCustomers) 
    .WithMany() // No navigation property here 
    .Map(m => 
     { 
      m.MapLeftKey("UserId"); 
      m.MapRightKey("CustomerId"); 
      m.ToTable("BridgeTableForCustomerAndUser"); 
     }); 
+1

Grazie mille, quello che una soluzione semplice. Per salvarmi la faccia lo biasimerò per mancanza di documentazione e non per la mia ignoranza. –

+0

È possibile farlo con gli attributi? – TDaver

+0

@TDaver: No, gli attributi possono funzionare solo se si dispone di proprietà di navigazione su entrambe le estremità e non si prevede di controllare il nome e le colonne nella tabella di giunzione. –