2012-01-16 15 views
6

Sto provando a collegare le tabelle di appartenenza di asp.net in un sito Web di asp.mvc 3. Ho seguito il tutorial nel libro di Steve Sanderson "Pro ASP.NET MVC 3 Framework" per il negozio di articoli sportivi e applicandolo alle tabelle che sono state generate dal membro di appartenenza.Mappatura delle tabelle di join in Entity Framework

Così ho una classe utente che assomiglia:

namespace Domain.Entities 
{ 
    public class User 
    { 
     public Guid UserId { get; set; } 
     public string UserName { get; set; } 
     public DateTime LastActivityDate; 
     public virtual ICollection<Role> Roles { get; set; } 
    } 

    public class Role 
    { 
     public Guid RoleId { get; set; } 
     public string RoleName { get; set; } 
    } 
} 

e una classe contesto che assomiglia a:

public class EFDbContext : DbContext 
{ 
    public DbSet<User> Users { get; set; } 
    public DbSet<Role> Roles { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<User>().ToTable("aspnet_users"); 
     modelBuilder.Entity<Role>().ToTable("aspnet_roles"); 
    } 
} 

ma ottengo un errore perché suppongo che è alla ricerca di un join tra queste due tabelle quando in realtà c'è una tabella di join (aspnet_UsersInRoles) in mezzo per evitare un collegamento molti a molti, quando provo a fare riferimento al modello Role dell'utente, ad esempio:

var test = _repository.Users.FirstOrDefault().Roles.Count(); 

{ "Nome non valido colonna 'User_UserId'. \ R \ nInvalid nome di colonna 'User_UserId'. \ R \ nInvalid nome di colonna 'User_UserId'."}

c'è un modo per mappare la tabella insieme usando la tabella di join usando il framework di entità? È meglio aggiungere un nuovo modello di dati di entità ADO.NET e lasciare che lo studio visivo esegua il reverse engineering del database?

+0

trovato un ottimo insieme di post di blog che coprono come manipolare EF qui: http://vincentlauzon.wordpress.com/2011/04/21/entity-framework-4- 1-bypassing-ef-query-mapping-8/nel caso in cui qualcun altro abbia esigenze simili – GrahamJRoy

risposta

17

è necessario personalizzare la mappatura molti a molti come segue

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<User>().ToTable("aspnet_users"); 
     modelBuilder.Entity<Role>().ToTable("aspnet_roles"); 

     modelBuilder.Entity<User>() 
     .HasMany(u => u.Roles).WithMany(r => r.Users) 
      .Map(m => 
      { 
       m.ToTable("aspnet_UsersInRoles"); 
       m.MapLeftKey("UserId"); 
       m.MapRightKey("RoleId"); 
      }); 
    } 

Edit: Si sarebbe anche bisogno di aggiungere Users proprietà alla classe Role. In caso contrario, la mappatura deve essere modificato in

 modelBuilder.Entity<User>() 
     .HasMany(u => u.Roles).WithMany() 
      .Map(m => 
      { 
       m.ToTable("aspnet_UsersInRoles"); 
       m.MapLeftKey("UserId"); 
       m.MapRightKey("RoleId"); 
      }); 
+0

sei una leggenda. grazie mille per questo – GrahamJRoy

+0

Ciao. Sì ha anche aggiunto l'utente alla classe Role con public virtual ICollection Users {get; impostato; }. Grazie ancora per il vostro aiuto – GrahamJRoy

Problemi correlati