Отображение таблиц соединения в Entity Framework - PullRequest
6 голосов
/ 16 января 2012

Я пытаюсь подключить таблицы членства asp.net к сайту asp.mvc 3.Я следовал учебному пособию в книге Стива Сандерсона «Pro ASP.NET MVC 3 Framework» для спортивного магазина и применял его к таблицам, сгенерированным из exe членства.

Итак, у меня есть класс пользователя, которыйвыглядит так:

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

и класс контекста выглядит так:

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

, но я получаю сообщение об ошибке, потому что я предполагаю, что он ищет соединение между этими двумя таблицами, когда на самом деле существуетявляется таблицей соединений (aspnet_UsersInRoles) между ними, чтобы избежать ссылки «многие ко многим», когда я пытаюсь ссылаться на модель ролей от пользователя, например:

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

{«Недопустимый столбецname 'User_UserId'. \ r \ nНеверное имя столбца 'User_UserId'. \ r \ nНеверное имя столбца 'User_UserId'. "}

есть способ сопоставить таблицу вместе с помощью таблицы объединения, используяструктура сущности?Лучше просто добавить новую модель данных сущности ADO.NET и позволить Visual Studio просто перепроектировать базу данных?

1 Ответ

17 голосов
/ 16 января 2012

Вам необходимо настроить отображение «многие ко многим» следующим образом:

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

Редактировать: Вам также необходимо добавить свойство Users в класс Role.В противном случае отображение должно быть изменено на

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