2013-06-03 2 views
2

У меня есть БД, который выглядит следующим образом:Определить модель для глубоких взаимоотношений/вложенных моделей

tblUsers 
    - UserId 
tblRoles 
    - RoleId 

tblUserRoles 
    - UserRoleId 
    - RoleId 
    - UserId 

class User 
{ 
    [Key] 
    public virtual int UserId{ get; set; } 

    [ForeignKey("UserId")] // how does this tell ef not to map it to the primary key. 
          It needs to map to UserId which is not defined as a key.?? 

    public DbSet<UserRole> Roles{ get; set; } 
}  

class UserRoles 
{ 
    [Key] 
    public virtual int UserRoleId{ get; set; } 

    public virtual int UserId{ get; set; } 
    public virtual int RoleId{ get; set; } 

    [ForeignKey("RoleId")] 
    Public Role RoleInfo {get; set;} 
} 

class Role 
{ 
    [Key] 
    public virtual int RoleId {get; set;} 

    public string RoleName {get; set;} 
} 

Я не думаю, что это правильно. Мне нужно настроить модель, где внешний ключ не является первичным ключом, а столбцом в таблице. Мой вопрос: как определить мою модель и связать связь между объектами без первичного ключа?

ответ

2

Вы имеете в виду, как бы вы могли связать эти таблицы вместе? Обычно у меня есть моя установка модели, чтобы зеркально отразить (по большей части) структуру таблицы базы данных. Ниже я расскажу, как настроить модель. User имеет коллекцию UserRoles, каждая из которых имеет одну Role с этой записью.

internal class User 
{ 
    public User() 
    { 
     UserRoles = new List<UserRole>(); 
    } 

    [Key] 
    public int UserId { get; set; } 

    public ICollection<UserRole> UserRoles { get; set; } 
} 

internal class UserRole 
{ 
    [Key] 
    public int UserRoleId { get; set; } 

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

    [ForeignKey("UserId")] 
    public User User { get; set; } 

    [ForeignKey("RoleId")] 
    public Role Role { get; set; } 
} 

internal class Role 
{ 
    public Role() 
    { 
     UserRoles = new List<UserRole>(); 
    } 

    [Key] 
    public int RoleId { get; set; } 

    public string RoleName { get; set; } 

    public ICollection<UserRole> UserRoles { get; set; } 
} 

Так в основном есть один ко многим между Пользователем и UserRole, и один ко многим между Role и UserRole

+0

Скомпилировано, но роли в нем не были загружены. Как Роли сопоставлены с UserRole в вашем примере? – Arcadian

+0

@ magic-c0d3r Righto, я обновил свой пример кода, чтобы иметь один-много между User и UserRole и один для многих между UserRole и Role. Это то, что вы имели в виду? – jstromwick

+0

Почему RoleInfo - коллекция в UserRole? любая помощь - большое спасибо. – Arcadian

3

Вам не нужно объявлен класс UserRoles, EF-код сначала создать отношения и таблицы необходимы позади сцены, это все, что вам нужно:

public class User 
{ 
    public int Id {get;set;} 
    public virtual ICollection<Role> Roles {get;set;} 
} 

public class Role 
{ 
    public int Id {get;set;} 
    public virtual ICollection<User> Users {get;set;} 
} 

затем переопределить OnModelCreating:

protected override void OnModelCreating(DbModelBuilder builder) 
{ 
    builder.Entity<User>() 
    .HasMany(u => u.Roles).WithMany(r => r.Users) 
    .Map(t => t.MapLeftKey("UserId") 
    .MapRightKey("RoleId") 
    .ToTable("UserRoles")); 
} 

Единственный раз, когда вам нужно объявить таблицу соединений самостоятельно, это если вам нужен many-to-many с полезной нагрузкой. Отметьте это сообщение many-to-many with payload

+0

. Как мне это сделать только от одного до многих. Если вы выведете пользователей из ролевой модели? – Arcadian

+0

@ magic-c0d3r, поэтому 'User' имеет одну« роль »? и 'Role', принадлежит многим« Пользователям »? проверить ответ. – SOfanatic

+0

Нет у пользователя много ролей, и роль может принадлежать многим пользователям. Но я не хочу показывать это в своей модели. Просто нужны пользователи с множеством ролей для работы. Если я не включу пользователей в класс UserRole – Arcadian

Смежные вопросы