2011-11-08 13 views
5

Witam Próbuję skonfigurować strukturę encji dla wielu do wielu relacji między użytkownikiem a rolą.Rola użytkownika Entity Framework Wiele do wielu relacji

Poniższy rysunek pokazuje, co jest w bazie danych:

Many to Many relationships

Model dla Użytkownika jest:

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; } 

} 

Wzór rolą jest:

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 jest:

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; } 
    } 

więc myślałem, że to ustawić w porządku, ale w moim kodu idę coś takiego:

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

i trafia w sam daje błędy:

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

więc dodałem następujące w kontekście:

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

} 

Jednak teraz pojawiają się błędy:

Błąd serwera w aplikacji "/". Nieprawidłowa nazwa kolumny "Role_RoleId". Nieprawidłowa nazwa kolumny "User_UserId".

Z pewnością nie mam tutaj poprawnie ustawionego. Czy orybody może wskazać mi właściwy kierunek?

Odpowiedz

9

Nie trzeba modelować tabeli linków UserRole jako klasy, ponieważ ma ona tylko podstawowe klucze w tabelach uczestniczących w relacji. Usuń więc klasę UserRole.

Jeśli modelujesz istniejącą bazę danych, EF może określić nazwę tabeli łącza jako RoleUser. Aby tego uniknąć, możesz skonfigurować tabelę linków w następujący sposób.

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

Co z przypadkiem, w którym jednostka ról nie zna użytkownika? Jak napisać kod konfiguracji? –

Powiązane problemy