Entityframework, почему таблица соединений получает дублированные значения? - PullRequest
0 голосов
/ 29 ноября 2018

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

Моя модель:

enter image description here

Задача :

Получение дубликатов после создания отношения.Допустим, я создаю пользователя с ролью «Поддержка».NetworkWebuserRoles получает отношение, НО в то же время NetworkWebRole получает дублирующее значение.

context:

enter image description here

Код:

    var user = _dbContext.NetworkWebUser.FirstOrDefault(x => x.UserName == userName);

    user.NetworkWebRole.Add(new NetworkWebRole
    {
        RoleName = role.ToString()
    });

    _dbContext.SaveChanges();

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

Результат:

enter image description here

РЕДАКТИРОВАТЬ:

Чтобы уточнить:

Когда я запускаю код выше, это происходит:

NetworkWebUserRoles получает новое соединение.НО по какой-то причине NetworkWebRole также получает новое значение, поэтому я получаю дубликаты

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

благодаря @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();

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

0 голосов
/ 29 ноября 2018

Вы создаете новую NetworkWebUserRole вместо ссылки на существующую запись.

Я бы также рекомендовал создать ограничение уникальности для NetworkWebUserRole, чтобы предотвратить роли с дублирующимися именами на уровне БД.

Пример:

user.NetworkWebRole.Add(role);

Предполагается, что ваша переменная роли имеет тип NetworkWebRole.Когда вы используете Add метод user.NetworkWebRole, он автоматически создаст запись в таблице NetworkWebUserRole.Если роль не существует, например, вызов new NetworkWebRole(), она будет вставлена ​​в таблицу соединений и в таблицу NetworkWebUserRoles.Поэтому, передав существующий объект роли (предположительно, отслеживаемый вашим EF-контекстом), вы можете идти.

...