2014-07-18 12 views
6

in Identity 2.0.0 abbiamo ruoli proprietà di navigazione in ApplicationUser con tipo IdentityUserRoles e abbiamo Utenti proprietà di navigazione in IdentityRole con lo stesso tipo IdentityUserRolesApplicationUser e ApplicationRole proprietà di navigazione a Identità 2.0.0

qui è

namespace Microsoft.AspNet.Identity.EntityFramework 
{ 
    // Summary: 
    //  EntityType that represents a user belonging to a role 
    // 
    // Type parameters: 
    // TKey: 
    public class IdentityUserRole<TKey> 
    { 
     public IdentityUserRole(); 

     // Summary: 
     //  RoleId for the role 
     public virtual TKey RoleId { get; set; } 
     // 
     // Summary: 
     //  UserId for the user that is in the role 
     public virtual TKey UserId { get; set; } 
    } 
} 

così, quando ho scorrere context.Users posso solo ID ruolo

c'è un modo per fare standart molti-a-molti mappatura betw un ApplicationUser e ApplicationRole?

Voglio essere in grado di fare qualcosa di simile

foreach (var user in ApplicationDbContextInstance.Users) 
{ 
    List<ApplicationRole> UserRoles = user.Roles.ToList(); 
    /* 
    some logic ... 
    */ 
} 

UPDATE:

dopo alcuni lavori su questa questione ho trovato una soluzione per il mio caso. forse non è così elegante come può essere, ma nel mio caso devo estendere IdentityUserRole con proprietà di navigazione aggiuntive

ho esteso IdentityUserRole a ApplicationUserRole e apportare le modifiche appropriate in tutte le soluzioni. Ecco la mia nuova IdentityUserRole:

public class ApplicationUserRole : IdentityUserRole<string> 
{ 
    public virtual ApplicationUser User { get; set; } 
    public virtual ApplicationRole Role { get; set; } 
    public virtual ICollection<GeoSectorForUser> GeoSectors { get; set; } 
} 

e ora posso avere tutti gli utenti in certo ruolo in questo modo:

foreach(ApplicationRole role in db.Roles){ 
    List<ApplicationUser> users = role.Users.Select(s => s.User).ToList(); 
} 

nel mio caso è necessaria AplicationUserRole per la memorizzazione di ulteriori proprietà di navigazione in modo che la soluzione è lavorato per me. ma ho ancora chiedendo come creare pulire relazione molti-a-molti tra IdentityUser e IdentityRole

+0

'IdentityUserRole' è l'oggetto intermedio che è già fornendo la relazione molti-a-molti. quindi 'IdentityUser' <->' IdentityUserRole' <-> 'IdentityRole ' – DavidG

+0

L'aggiornamento non funziona per me. Ottengo eccezioni quando provo a creare una nuova migrazione. – Thomas

risposta

2

IdentityUser.Roles() ti dà una collezione di IdentityUserRole oggetti che contengono solo RoleId e UserId proprietà. Per ottenere una raccolta di oggetti Role per un utente, è necessario utilizzare la classe RoleManager (scrivendo questo fuori dalla parte superiore della mia testa in modo non può funzionare al 100%):

var roleManager = new RoleManager(); 

foreach (var user in ApplicationDbContextInstance.Users) 
{ 
    List<IdentityUserRole> UserRoles = user.Roles.ToList(); 

    foreach(var userRole in UserRoles) 
    { 
     var role = roleManager.FindbyId(userRole.RoleId); 
    } 

} 
+1

si. è così che devo usarlo. ma la mia domanda riguarda la possibilità di una mappatura molti-a-molti standard. comunque, grazie per la risposta – taburetkin

Problemi correlati