2013-05-03 2 views
3

Я использую Entity Code Сначала для создания базы данных и таблиц для хранения пользователей, ролей и UserRoles.Код сущности Первый пользователь, роль, таблицы UserRole

Мои следующие классы -

public class User 
    { 
     public int UserId { get; set; } 
     public string Username { get; set; } 
     public string Password { get; set; } 
    } 


public class Role 
{ 
     public int RoleId { get; set; } 
     public string Rolename { get; set; } 
} 


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

    public virtual User User { get; set; } 
    public virtual Role Role { get; set; } 
} 

class ConfigurationContext : DbContext 
{ 
    public ConfigurationContext() 
    { 
     Database.SetInitializer<ConfigurationContext>(new DropCreateDatabaseIfModelChanges<ConfigurationContext>()); 
    } 

    public DbSet<Role> Roles { get; set; } 
    public DbSet<User> Users { get; set; } 
    public DbSet<UserRole> UserRoles { get; set; } 
} 

Моя цель заключается в подключении пользователей к ролям с помощью таблицы UserRole.

Я мог бы сделать это, создав таблицы и используя инструмент CF Reverse Engineer Tool, но это создает много избыточного кода и хотел бы знать, как это сделать.

ответ

7

Вам не нужен объект UserRole. EF может автоматически управлять отношениями «многие ко многим», создавая соответствующую таблицу ссылок в базе данных без этой сущности.

Простым решением является просто добавить две коллекции к вашим объектам User и Role. EF обнаружит много-ко-многим по соглашению без дальнейшей явной конфигурации:

public class User 
{ 
    public int UserId { get; set; } 
    public string Username { get; set; } 
    public string Password { get; set; } 

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

public class Role 
{ 
    public int RoleId { get; set; } 
    public string Rolename { get; set; } 

    public virtual ICollection<User> Users { get; set; } 
} 

class ConfigurationContext : DbContext 
{ 
    public ConfigurationContext() 
    { 
     Database.SetInitializer<ConfigurationContext>(
      new DropCreateDatabaseIfModelChanges<ConfigurationContext>()); 
    } 

    public DbSet<Role> Roles { get; set; } 
    public DbSet<User> Users { get; set; } 
} 

Если вам не нужны или хотите одну из коллекций, скажем, вы не хотите Role.Users, то вы можете создать многие-ко-многим только одна коллекция, определив его с Fluent API:

public class User 
{ 
    public int UserId { get; set; } 
    public string Username { get; set; } 
    public string Password { get; set; } 

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

public class Role 
{ 
    public int RoleId { get; set; } 
    public string Rolename { get; set; } 
} 

class ConfigurationContext : DbContext 
{ 
    public ConfigurationContext() 
    { 
     Database.SetInitializer<ConfigurationContext>(
      new DropCreateDatabaseIfModelChanges<ConfigurationContext>()); 
    } 

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

    public DbSet<Role> Roles { get; set; } 
    public DbSet<User> Users { get; set; } 
} 
0

CF перепроектируете Tool, но производит много лишнего кода и хотел бы знать, как сделать это чисто ,

Абсолютно согласен. Мой подход заключается в использовании Entity Framework Power Tools, но иногда вам нужно выбрать чистый код вручную. А как насчет создания многих отношений между ролями и пользователями, на которые я уже ответил? here. И вам не нужен объект UserRole.

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