EF 4.0 - отношение многие ко многим - проблема с удалениями - PullRequest
4 голосов
/ 29 апреля 2010

Моя модель сущности выглядит следующим образом: Person, Store и PersonStores Многодетная дочерняя таблица для хранения PeronId, StoreId Когда я получаю человека, как в приведенном ниже коде, и пытаюсь удалить все StoreLocations, он удаляет их из PersonStores, как упомянуто, но также удаляет его из таблицы Store, что нежелательно. Кроме того, если у меня есть другой человек с таким же идентификатором магазина, то он не говорит "The DELETE statement conflicted with the REFERENCE constraint \"FK_PersonStores_StoreLocations\". The conflict occurred in database \"EFMapping2\", table \"dbo.PersonStores\", column 'StoreId'.\r\nThe statement has been terminated", поскольку он пытался удалить StoreId, но этот StoreId использовался для другого PeronId и, следовательно, вызывалось исключение.

 Person p = null;
        using (ClassLibrary1.Entities context = new ClassLibrary1.Entities())
        {
            p = context.People.Where(x=> x.PersonId == 11).FirstOrDefault();
            List<StoreLocation> locations = p.StoreLocations.ToList();
            foreach (var item in locations)
            {
                context.Attach(item);
                context.DeleteObject(item);
                context.SaveChanges();
            }
        } 

1 Ответ

10 голосов
/ 29 апреля 2010

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

 Person p = null;
 using (ClassLibrary1.Entities context = new ClassLibrary1.Entities())
 {
     p = context.People.Where(x=> x.PersonId == 11).FirstOrDefault();
     p.StoreLocations.Clear();
     context.SaveChanges();
 }

Это получит ваш человек, удалит все магазины из его списка магазинов и сохранит изменения. Обратите внимание, что вам может понадобиться оператор включения в первой строке блока using, в зависимости от того, как настроен ваш ObjectContext.

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