2011-11-08 27 views
5

Hola, estoy tratando de configurar mi marco de entidad para una relación de muchos a muchos entre el usuario y el rol.Roles de usuario de Entity Framework Relación de muchos a muchos

El cuadro siguiente muestra lo que está en la base de datos:

Many to Many relationships

el modelo de usuario es:

public class User : IEntity 
    { 
     public virtual int UserId { get; set; } 
     [Column(TypeName = "varchar")] 
     [StringLength(100)] 
     public virtual string UserName { get; set; } 
     [Column(TypeName = "varchar")] 
     [StringLength(100)] 
     public virtual string FirstName { get; set; } 
     [Column(TypeName = "varchar")] 
     [StringLength(100)] 
     public virtual string LastName { get; set; } 
     [Column(TypeName = "varchar")] 
     [StringLength(200)] 
     public virtual string EmailAddress { get; set; } 
     public int AreaId { get; set; } 
     [Column(TypeName = "varchar")] 
     [StringLength(64)] 
     public string CreatedByUserName { get; set; } 
     public DateTime CreatedDateTime { get; set; } 
     [Column(TypeName = "varchar")] 
     [StringLength(64)] 
     public string LastModifiedByUserName { get; set; } 
     public DateTime? LastModifiedDateTime { get; set; } 

     //Navigation properties 
     //public virtual Role Role { get; set; } 
     public virtual Area Area { get; set; } 

     public virtual ICollection<Role> Roles { get; set; } 

} 

Modelo de papel es:

public class Role : IEntity 
    { 
     public int RoleId { get; set; } 
     [Column(TypeName = "varchar")] 
     [StringLength(100)] 
     public string Name { get; set; } 
     [Column(TypeName = "varchar")] 
     [StringLength(1000)] 
     public string Description { get; set; } 
     [Column(TypeName = "varchar")] 
     [StringLength(64)] 
     public string CreatedByUserName { get; set; } 
     public DateTime CreatedDateTime { get; set; } 
     [Column(TypeName = "varchar")] 
     [StringLength(64)] 
     public string LastModifiedByUserName { get; set; } 
     public DateTime? LastModifiedDateTime { get; set; } 

     //Navigation Properties 
     public ICollection<User> Users { get; set; } 
    } 

UserRole es:

public class UserRole 
    { 
     public int UserId { get; set; } 
     public int RoleId { get; set; } 

     //Navigation properties 
     public virtual User User { get; set; } 
     public virtual Role Role { get; set; } 
    } 

así que pensé que había esta configuración bien, pero en mi código que ser algo como:

var roles = from r in user.Roles 
         select r.Name; 

y se dispara en sí produce errores de:

Server Error in '/' Application. 
Invalid object name 'dbo.RoleUser'. 

por lo que añade lo siguiente dependiendo del contexto:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      modelBuilder.Entity<User>() 
       .HasMany(i => i.Roles) 
       .WithMany(u => u.Users); 

} 

Sin embargo, ahora que estoy recibiendo errores de:

Error del servidor en la aplicación '/'. Nombre de columna no válido 'Role_RoleId'. Nombre de columna no válido 'User_UserId'.

Así que seguramente no tengo algo configurado aquí correctamente. ¿Puede yy alguien señalarme en la dirección correcta?

Respuesta

9

No necesita modelar la tabla de enlaces UserRole como una clase ya que solo las claves principales de las tablas participan en la relación. Por lo tanto, elimine la clase UserRole.

Si está modelando una base de datos existente, EF puede inferir que el nombre de la tabla de enlaces sea RoleUser. Para evitar esto, puede configurar la tabla de enlaces de la siguiente manera.

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
     modelBuilder.Entity<User>() 
      .HasMany(i => i.Roles) 
      .WithMany(u => u.Users) 
      .Map(m => 
      { 
       m.ToTable("UserRole"); 
       m.MapLeftKey("UserId"); 
       m.MapRightKey("RoleId"); 
      }); 

} 
+0

¿Qué tal si la entidad Rol no conoce la entidad Usuario? ¿Cómo escribir el código de configuración? –

Cuestiones relacionadas