Как добавить или удалить отношение многие ко многим в Entity Framework? - PullRequest
2 голосов
/ 07 июня 2011

Существует таблица «многие ко многим» UserFeed, которая находится между User и Feed и обозначает твиттер-подобные отношения следования.
Он имеет только два поля, которые образуют составной ключ: UserID и FeedID.

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

public void SetSubscriptionFlag (int userId, int storeId, bool subscribe)
{
}

Я новичок в Entity Framework, поэтому я пытаюсь найти и следовать "EF-ish" способу сделать это.

Мои первые мысли:

  • Вместо того, чтобы работать со средним UserFeed классом, я должен создать свойство 1018 * "многие ко многим" ( РЕДАКТИРОВАТЬ: хит ограничения здесь);
  • После того, как я это сделаю, мне нужно будет извлечь экземпляр User по идентификатору, проверить, дал ли он Feed в своем Subscriptions, и добавить / удалить его в зависимости от флага и текущего существования;
  • Выясните, как избежать гоночных конфликтов, когда перед проверкой и добавлением / удалением есть временной интервал, и пользователю удается отправить два запроса на добавление или удаление;
  • Оптимизируйте мой код, чтобы избежать ненужных SELECT, если таковые возникнут, потому что все, что я действительно хочу сделать, - это один SELECT и один INSERT / DELETE.

Соответствующий фрагмент кода и комментарий к моим пунктам высоко ценится.

Спасибо!

1 Ответ

7 голосов
/ 07 июня 2011

Вы можете использовать фиктивные объекты - это определенно работает для вставки, и я надеюсь, что это можно использовать и для удаления:

Создать новую связь:

var user = new User() { Id = userId };
context.Users.Attach(user);
var store = new Store() { Id = storeId };
context.Stores.Attach(store);

// Now context trackes both entities as "existing"
// and you can build a new relation
user.Subscriptions.Add(store);
context.SaveChanges();

Удалить существующее отношение:

var user = new User() { Id = userId };
var store = new Store() { Id = storeId };
user.Subscriptions.Add(store);
context.Users.Attach(user);

// Now context trackes both entities as "existing"
// with "existing" relation so you can try to remove it
user.Subscriptions.Remove(store);
context.SaveChanges();
...