EF: Вставка уже существующей записи во многих отношениях - PullRequest
0 голосов
/ 11 июня 2018

Для того, что я искал, есть 2 способа вставить уже присутствующую запись в список ICollection:

  1. group.Users.Add(db.Users.FirstOrDefault(x=> x.Id = 1));
  2. var to_add = new User{Id: 1}; db.Users.Attach(to_add); group.Users.Add(to_add);

Проблема обоих вышеперечисленных подходов в том, что каждый раз, когда мы хотим добавить запись, она вызывает db-вызов.В то время как мы уже знаем идентификатор пользователя и идентификатор группы, и это все, что нужно для создания отношения.

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

1 Ответ

0 голосов
/ 11 июня 2018

Итак, у вас есть Groups и Users.Каждый Group имеет ноль или более Users;каждый User имеет ноль или более Groups.Традиционное отношение «многие ко многим».

Обычно можно добавить User к Group или Group к User.Однако у вас нет ни Group, ни User, у вас есть только GroupId и UserId.и из-за большого количества вставок вы не хотите извлекать Users и Groups, из которых вы хотите создать отношения

Проблема в том, что если бы вы могли добавить комбинацию GroupId-UserIdнепосредственно к вашей соединительной таблице, как вы узнали бы, что не добавите уже существующее отношение «группа-пользователь»?Если тебя это не волнует, ты получишь двойное отношение.Это может привести к проблемам: хотите ли вы, чтобы они отображались дважды, если вы спросите Users из Group?Какой из них должен быть удален, если связь заканчивается, или все они должны быть удалены?

Если вы действительно хотите реализовать возможность двойного отношения, тогда вам нужно будет Реализовать таблицу пользовательских соединений какздесь описано В дополнительном поле будет указано количество отношений.

Это не поможет вам с большой партией, поскольку вам все равно потребуется извлечь поле из пользовательской таблицы соединений, чтобы увеличить NrOfRelations value.

С другой стороны, если вы не хотите двойных отношений, вам нужно проверить, существует ли значение, и вы не хотите извлекать данные перед вставкой.

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

Подумайте о том, чтобы запомнить уже выбранные группы и пользователей в словаре, чтобы они не выбирались дважды.Однако, если ваш список действительно огромен, это не практичное решение.

Если вам действительно нужна эта функция в течение длительного периода времени, подумайте о создании хранимой процедуры, которая проверяет, существует ли GroupId / UserId всоединительную таблицу, и если нет, добавьте ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...