Вставка «многие ко многим» с Entity Framework - PullRequest
1 голос
/ 14 июля 2011

Я - две сущности в моей модели данных, например, Пользователь и Роль, оба имеют поле идентификатора в качестве первичного ключа. Между ними есть отношения многие ко многим. В базе данных есть три таблицы: таблица соединений Users, Roles и UsersRoles.

Я пытаюсь добавить нового пользователя в таблицу Users:

using(var myContext = new MyContext)
{
   var user = new User() { ... };
   user.Roles.Add(new Role() { ID = 1 });
}

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

Есть ли способ сказать Entity Framework не добавлять новую запись в таблицу ролей, если такая роль уже существует, а только обновлять таблицы Users и UserRoles? EF версия 1.0

Заранее спасибо.

Ответы [ 2 ]

5 голосов
/ 14 июля 2011

Если роль уже существует в БД, вы должны сказать EF, прикрепив роль к контексту:

using(var myContext = new MyContext)
{
    var role1 = new Role() { ID = 1 };
    myContext.Roles.Attach(role1);

    var user = new User() { ... };
    user.Roles.Add(role1);

    myContext.Users.AddObject(user);

    myContext.SaveChanges();
}

(Я надеюсь, что это также работает в EF 1.)

0 голосов
/ 18 июля 2011

Нашли рабочее решение, хотя оно и не идеально:

using(var _context = new MyContext())
{
    var user = ... //User we're adding to db 
    var roles = ...//List of roles
    foreach(var role in roles)
    {
        var ro = role;
        var roleAlreadyInDB = _context.Roles.Where(r => r.ID == ro.ID).FirstOrDefault();
        if (roleAlreadyInDB != null)
            user.Roles.Add(roleAlreadyInDB);
        else user.Roles.Add(new Role() { ID = ro.ID });
    }
}

Это не нарушает Первичные ключи в БД.

...