Свободный API Много-много ошибок сопоставления - PullRequest
1 голос
/ 03 ноября 2011

У меня есть следующее отображение для поддержки таблицы «многие ко многим» (User_Role)

     modelBuilder.Entity<Role>()
        .HasMany<User>(u => u.users)
        .WithMany(r => r.roles)
        .Map(m => 
           m.MapLeftKey("role_id")
           m.MapRightKey("user_id")
           m.ToTable("User_Role"));

Это прекрасно работает от сопоставления множества ролей пользователю и множества пользователей роли. Проблема у меня возникает, когда мне нужно добавить новую строку в таблицу User_Role через сущность следующим образом:

public class User_Role
{
   [Key Column(Order=1)]   
   public int role_id {get;set;)
   [Key Column(Order=1)]
   public int user_id {get;set;)
}

Всякий раз, когда я пытаюсь получить доступ к этой сущности следующим образом:

 dbContext.User_Role.Add(new User_Role {user_id ....

EF ищет несуществующую таблицу с именем User_Role1 ... она добавляет '1' к имени таблицы.

Затем я попытался добавить:

  [Table("User_Role")] 

Это позаботится о добавлении '1', но теперь я получаю эту ошибку:

«EntitySet« RoleUser »со схемой« dbo »и таблицей« User_Role »уже определен. Каждый EntitySet должен ссылаться на уникальную схему и таблицу»

Я смог подтвердить, что следующие строки вызывают проблему, но мне как-то нужны они оба

 m.ToTable("User_Role") and public class User_Role..

Любые предложения будут великолепны ... Я в тупике.

1 Ответ

4 голосов
/ 03 ноября 2011

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

var user = dbContext.Users.Single(u => u.id == user_id);
var role = dbContext.Roles.Single(r => r.id == role_id);

// if you don't have lazy loading and don't instantiate the collection
// in the constructor, add this: user.roles = new List<Role>(); 

user.roles.Add(role);

dbContext.SaveChanges();

Это запишет запись для новой связи (пары (user_id, role_id)) в таблицу соединений.

Редактировать

Если у вас есть только два ключевых свойства под рукой и вы не хотите загружать пользователя и роль из базы данных, которую выможет работать с прикрепленными «заглушками»:

var user = new User { id = user_id, roles = new List<Role>() };
var role = new Role { id = role_id };

dbContext.Users.Attach(user);
dbContext.Roles.Attach(role);

user.roles.Add(role);

dbContext.SaveChanges();
...