Entityframework, почему таблица соединений получает дублированные значения?
Я хочу создавать новых пользователей в приложении и назначать им роли. у меня есть таблица связи между таблицей пользователя и роли. Мне удается создать связь между таблицами, но в то же время я получаю дубликаты.
Моя модель:
Проблема:
Получение дубликатов после создания отношений. Допустим, я создаю пользователя с ролью "Поддержка".NETworkWebuserRoles получает отношение, НО в то же время NetworkWebRole получает повторяющееся значение.
контекст:
Код:
var user = _dbContext.NetworkWebUser.FirstOrDefault(x => x.UserName == userName);
user.NetworkWebRole.Add(new NetworkWebRole
{
RoleName = role.ToString()
});
_dbContext.SaveChanges();
создает отношения между ролью и пользователем, но дает мне дубликаты.
Результат:
РЕДАКТИРОВАТЬ:
Чтобы уточнить:
Когда я запускаю код выше, это происходит:
NetworkWebUserRoles получает новое соединение. НО по какой-то причине NetworkWebRole также получает новое значение, поэтому я получаю дубликаты
2 ответа
Вы создаете новую NetworkWebUserRole вместо ссылки на существующую запись.
Я также рекомендовал бы создать ограничение уникальности для NetworkWebUserRole, чтобы предотвратить роли с дублирующимися именами на уровне БД.
Пример:
user.NetworkWebRole.Add(role);
Это предполагает, что ваша переменная роли имеет тип NetworkWebRole
, Когда вы используете Add
метод user.NetworkWebRole
, он автоматически создаст запись в NetworkWebUserRole
Таблица. Если роль не существует, например, вызов new NetworkWebRole()
, он вставит в таблицу сцепления и в NetworkWebUserRoles
Таблица. Таким образом, передав существующий объект роли (предположительно, отслеживаемый вашим EF-контекстом), можно начинать.
Благодаря @Jason Armstrong я изменил свой код следующим образом:
var user = _dbContext.NetworkWebUser.FirstOrDefault(x => x.UserName == userName);
// find the role that already exist in the database
var roleExisting = _dbContext.NetworkWebRole.FirstOrDefault(x => x.RoleName == role.ToString());
user.NetworkWebRole.Add(roleExisting); // connect the user to an existing role
// entity framework add() will connect
//it in relationship table
_dbContext.SaveChanges();
Для тех, кто может с этим бороться, стоит обратить внимание на то, что вы не хотите создавать новую роль, new Role(
) здесь неверно. Вы извлекаете существующую роль из базы данных и подключаете к ней пользователя.
Я также обновил свой ролевый стол, чтобы его имя было уникальным.
РЕДАКТИРОВАТЬ:
В качестве правки для этого я подумал, что было бы хорошо узнать, как удалить связь, а также.
В моем случае:
var user = _dbContext.NetworkWebUser.Where(x => x.Id == id).Include(v=> v.NetworkWebRole);
_dbContext.NetworkWebUser.RemoveRange(user);
_dbContext.SaveChanges();
Нашел ответ на этот вопрос здесь