У меня простая настройка таблицы
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);
}
}
Любые дальнейшие идеи о том, как решить эту проблему?
Сопоставление ошибки: "Сохранение или принятие изменений завершилось неудачно, потому что более одного объекта типа" "имеют одинаковое значение первичного ключа"...
Это часто происходит, когда 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.
userModel
, как вuserModel.Roles
? Мое первое предположение состоит в том, что в нем нет ролей, которые вы ожидаете.