Роли пользователя Entity Framework Отношения «многие ко многим» - PullRequest
5 голосов
/ 08 ноября 2011

Привет! Я пытаюсь настроить свою структуру сущностей для отношений «многие ко многим» между пользователем и ролью.

На рисунке ниже показано, что находится в базе данных:

Many to Many relationships

Модель для пользователя:

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

}

Модель для роли:

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:

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

Так что я думал, что у меня все настроено нормально, но в моем коде я что-то вроде:

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

и стреляет сам с ошибками:

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

поэтому я добавил следующее в контекст:

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

}

Однако теперь я получаю ошибки:

Ошибка сервера в «/» приложении. Неверное имя столбца 'Role_RoleId'. Неверное имя столбца 'User_UserId'.

Так что, конечно, у меня здесь что-то не правильно настроено. Может ли кто-нибудь направить меня в правильном направлении?

1 Ответ

9 голосов
/ 08 ноября 2011

Вам не нужно моделировать таблицу ссылок UserRole как класс, поскольку в ней участвуют только первичные ключи таблиц.Поэтому удалите класс UserRole.

Если вы моделируете существующую базу данных, EF может вывести имя таблицы ссылок на RoleUser.Чтобы избежать этого, вы можете настроить таблицу ссылок следующим образом.

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

 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...