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();

Нашел ответ на этот вопрос здесь

Другие вопросы по тегам