2013-05-23 5 views
8

È possibile mappare una relazione molti a molti senza avere una proprietà di navigazione su una delle estremità? Ad esempio, ho alcuni widget e alcuni utenti che possono presentare particolari widget. Mi piacerebbe essere in grado di vedere ciò che un utente si preoccupa widget stelle, ma non mi importa di vedere tutti gli utenti che hanno recitato un particolare widgetMappa da molte a molte relazioni senza proprietà di navigazione

Widget.cs

public int Id { get; set; } 
public string Name { get; set; } 

utente. cs

public int Id { get; set; } 
public string Username { get; set; } 
public ICollection<Widget> StarredWidgets { get; set; } 

Con questa impostazione, EF genererà una relazione uno-a-molti da Widget a Utenti. Tuttavia, deve essere molti per molti. Mi rendo conto che potrei aggiungere uno public ICollection<User> Users a Widget.cs, ma solo vedere se c'era un altro modo per aggirare questo.

risposta

27

Si può e questo caso deve definire il molti-a-molti con API Fluent:

modelBuilder.Entity<User>() 
    .HasMany(u => u.StarredWidgets) 
    .WithMany() // <- no parameter here because there is no navigation property 
    .Map(m => 
    { 
     m.MapLeftKey("UserId"); 
     m.MapRightKey("WidgetId"); 
     m.ToTable("UserWidgets"); 
    }); 
+0

Questo sembra per impostare le tabelle del database in modo corretto e quando chiamo 'myUserPrefObj.StarredWidgets.Add (myWidget) 'la voce viene aggiunta correttamente alla tabella di join. Tuttavia, più tardi, quando provo a ricaricare 'myUserPrefObj' usando un diverso contesto db, la proprietà' StarredWidgets' è nullo. Qualche idea? – Kyle

+0

Non importa. Mi sono reso conto di aver dimenticato di contrassegnare la proprietà di navigazione 'virtuale'. – Kyle

+1

@Kyle: Questo è "normale" :) Se vuoi caricare un'entità e * includere * una delle sue proprietà di navigazione devi usare, beh ... * Include *: 'context.Users.Include (u => u. StarredWidgets) .Dove ... '. O contrassegna 'StarredWidgets' come' virtuale', quindi il caricamento lazy caricherà la raccolta, ma richiederà una seconda query DB. Con 'Include' hai bisogno di una sola query. – Slauma