Проблемы с обновлением отношений «многие ко многим» в Entity Framework 6 (Code First)

1

У меня простая настройка таблицы

User
- Id
- Name

Role
- Id
- Name

UserRole
- UserId
- RoleId

Использование Fluent У меня объявлено следующее соотношение

this.HasMany(t => t.Roles)
.WithMany(s => s.Users)
.Map(m =>
{
        m.ToTable("UserRole");
        m.MapLeftKey("UserId");
        m.MapRightKey("RoleId");
});

Когда я создаю нового пользователя с несколькими ролями, он добавляет их правильно в базу данных. Когда я обновляю пользователя с ролью, которая еще не существует, тогда все в порядке.

У меня возникают проблемы с добавлением следующего:

Существующие роли

Role A
Role B
Role C

Я хочу удалить роль B, оставив

Role A
Role C

Я пробовал пару вещей, но всегда получаю "Дополнительная информация: сэкономить или принять изменения не удалось, потому что более одного объекта типа"... Роль "имеют одно и то же значение первичного ключа". или вообще не происходит удаление.

Способ 1

Я пробовал такие вещи, как создание метода для удаления всех ролей, а затем просто добавления входящих ролей, но по какой-то причине он поддерживает отслеживаемые изменения и по-прежнему видит удаленные роли.

public ActionResult Edit(int userId, User user)
{
    // clear roles
    _userService.ClearRoles(userId);
    _unitOfWork.Save();

    // if I put a break here, I can see the roles being removed from the database


    // update user with new roles
    _userService.Update(id, user)
    _unitOfWork.Save();

}


// _userService.Update

public void Update(int userId, User user)
{
    User existingUser = Find(userId);
    if (existingUser != null)
    {
        existingUser.Roles = user.Roles;
        _userRepository.Update(existingUser);
    }
}

public void ClearRoles(int userId)
{
   User existingUser = GetUser(userId);

   if(existingUser != null)
   {
       existingUser.Roles.ToList().ForEach(f => existingUser.Roles.Remove(f));                
   }
}

Способ 2

Я попытался удалить объекты Role, но Роли не удаляются, ничего не происходит

 public ActionResult Edit(int userId, User user)
 {
        _userService.Update(id, user)
        _unitOfWork.Save();

 }


// _userService.Update

public void Update(int userId, User user)
{
    User existingUser = Find(userId);

    if (existingUser != null)
    {
        existingUser.Roles.ToList().ForEach(f => existingUser.Roles.Remove(f));
        existingUser.Roles = user.Roles;

        _userRepository.Update(existingUser);
    }
}

Любые дальнейшие идеи о том, как решить эту проблему?

  • 0
    Что такое userModel , как в userModel.Roles ? Мое первое предположение состоит в том, что в нем нет ролей, которые вы ожидаете.
  • 0
    извините, что должен был прочитать user.Roles.
Показать ещё 5 комментариев
Теги:
entity-framework

1 ответ

0

Сопоставление ошибки: "Сохранение или принятие изменений завершилось неудачно, потому что более одного объекта типа" "имеют одинаковое значение первичного ключа"...

Это часто происходит, когда dbcontext, имеющий несколько одинаковых объектов, orginated из другого контекста db, очищается от базы данных.

пример

  public void Save(PlcVariable plcVariable)
    {
        try
        {
            using (var context = new XBSDbDataContext())
            {
                plcVariable.PlcVariableMeasure.LineObjects // Plc variable has a selfreference that has a list of lineobject, that already has a line object with id = 1
                var lineobject =  new LineObjectService().GetById(1);//=> this line object is orginated from another Dbcontext.
                plcVariable.LineObjects.Add(lineobject); 
                context.SaveChanges(); // error occurs
                // EF will see the added line object as a different object, because it is coming from another dbcontext, than the same object(equal id's) that is already present.
            }

Вы можете попытаться обеспечить загрузку объекта одним dbContext.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню