2016-06-17 4 views
1

Итак, я, наконец, обернулся вокруг саморегуляции многих ко многим отношениям в коде EF, но теперь я могу ответить на вопрос о наилучшем способе обновите эти отношения.EF code-first Self-Referencing Рекомендации по обновлению многих-ко-многим

Допустим, у нас есть этот вид отношений:

modelBuilder.Entity<Contact>() 
        .HasMany(c => c.Friends) 
        .WithMany() 

со следующим в Contact.cs классе:

public virtual iCollection<Contact> Friends {get;set;}; 

В моем Контакте зрении, у меня есть Множественный выбирать друг для Контакта , Затем я сохраняю, повторяя все выбранные и запуская thisContact.Friends.Add(friend) и сохраняя изменения.

Затем, когда вы вернетесь в контактный вид, достаточно легко получить .Friends и повторно заполнить мультиселекцию, но у меня возникли проблемы с повторным сохранением новых друзей. Каков наилучший способ сделать это? Сначала я решил удалить всех друзей, а затем добавить новые из мультиселекта, но это не кажется очень эффективным, и я не был уверен точно, в какой момент удалить .Friends в отношении сохранения Contact.

Есть ли чистый способ пройти через новые элементы, выбранные из мультиселекта, сравнить его с тем, что уже находится в thisContact.Friends, добавить новые, удалить те, которые там не существуют, и сохранить соответствующие им?

Надеюсь, это имеет смысл, спасибо заранее!

+0

Просто замена друзей на сегодняшний день является самым простым способом. Это не дорого, потому что задействованы только очень маленькие записи (если нет сотен предметов). –

+0

Вы имеете в виду удаление существующих друзей и добавление новых? – blubberbo

+0

Да. Только записи в таблице соединений удаляются и повторно вставлены, а не сами контакты. –

ответ

1

Скажите, что у вас есть ваша коллекция доменов (contact.Friends) и ваша коллекция друзей, возвращенная из пользовательского интерфейса (uiFriends).

Сначала вы найти друзей, которые были удалены (псевдо код)

var removeTheseFriends = contact.Friends.Except(uiFriends); // Returns friends that are only in your domain collection 
var addTheseFriends = uiFriends.Except(contact.Friends); // Returns friends only in your UI collection 

«За исключением» метод только хорошо, если вы передаете полные объекты. https://msdn.microsoft.com/en-us/library/bb300779(v=vs.90).aspx

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

var removeTheseFriends = contact.Friends.Where(i => !uiFriends.Contains(i.Id)); 

// First load the list of friends that correspond to your ui collection Ids 
var domainObjectsOfUiFriendsCollection = context.Contacts.Where(i => uiFriends.Contains(i.Id)); 

// These are now domain objects, so you can now use the Except functionality 
var addTheseFriends = domainObjectsOfUiFriendsCollection.Except(contact.Friends); 

Тогда просто перебирать списки и добавлять/удалять их по мере необходимости.

+0

благодарим за информацию! Думаю, я останусь с удалением, а затем добавлю их снова, поскольку я не думаю, что это будет слишком облагаться системой. – blubberbo

+0

С вышеуказанным просто удалите те, которые нужно удалить, и добавьте новые. Контакты, которые не меняются, не должны ничего делать с ними. – user1455010

+0

Прошу прощения, но я точно не знаю, как ваше последнее предложение «Затем просто перебирайте списки и добавляйте/удаляйте их по мере необходимости». будет выглядеть с переменными, которые вы создали. Не могли бы вы написать это для меня? – blubberbo