WCF и EF многие ко многим получают дубликаты - PullRequest
3 голосов
/ 13 сентября 2011

enter image description here

Используя приведенную выше модель, я пытаюсь сохранить новый PamNewsMessage и добавить к нему теги, а затем сохранить его в БД.Однако, после того, как я попробовал много разных комбинаций добавления объектов и сохранения, у меня все еще остается та же проблема с дублирующимися записями (не дублирующимися ключами).используется для внесения изменений, и это работает для PamNewsMessage, однако, если тег уже существует, он создает дубликаты.

_theService = new WCFPamUpdateServiceEntities3();
_theService.PamNewsMessages.AddObject(pnm);
_theService.SaveChanges();

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

Спасибо,

Ричард

Извините, что не могу публиковать фотографии, долгое время читающий первый постер: -)
(исправленоэто для тебя - marc_s)

1 Ответ

1 голос
/ 13 сентября 2011

Здесь - немного теории, когда я впервые столкнулся с проблемой. Здесь является некоторым описанием, связанным с EF.

Краткий ответ: EF не сделает этого за вас.

Вы работали с отсоединенными объектами, и теперь вы должны явно сказать EF, какие изменения вы сделали = это обычно означает игру с состоянием каждой сущности в графе и каждой независимой ассоциации в графе (многие- ко многим это всегда независимая ассоциация).Если вы звоните AddObject, вы говорите EF добавить целый граф объектов, а не только один объект.

Если вы просто знаете, что добавляете NewsMessage, и в этом сообщении будут только существующие теги, вы можете сделать что-то вроде:

_theService = new WCFPamUpdateServiceEntities3();
_theService.PamNewsMessages.AddObject(pnm);
foreach (var tag in pnm.Tags)
{
    _theService.ObjectStateManager.ChangeObjectState(tag, EntityState.Unchanged);
}
_theService.SaveChanges();

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

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