Удаление всех связанных объектов в Entity Framework - PullRequest
2 голосов
/ 29 марта 2012

У меня есть объект Entry, подключенный к нескольким окнам TimeWindows. Я хочу очистить все временные окна, а затем добавить новые. Сначала я попробовал:

target.TimeWindows.Clear();

но это на самом деле не удаляло их, и только попыталось удалить связь, что вызвало исключение, поскольку существует внешний ключ от TimeWindows для Entry. Тогда я подумал, что должен сделать это:

foreach (var tw in target.TimeWindows)
    context.DeleteObject(tw);

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

while (target.TimeWindows.Count > 0)
    context.DeleteObject(target.TimeWindows.Last());

Но теперь меня немного беспокоит использование свойства Count, потому что это может привести к выполнению оператора SQL SELECT COUNT. Является ли? Если да, как я могу удалить все временные окна в Entity Framework?

1 Ответ

3 голосов
/ 29 марта 2012

Счетчик вызовов для свойства навигации будет вызывать выбор, только если включена отложенная загрузка, а свойство еще не загружено. Таким образом, первый вызов может вызвать что-то вроде:

SELECT * FROM TimeWindows WHERE TargetId = @targetId

и все подсчеты будут выполняться только для загруженных данных.

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

foreach (var tw in target.TimeWindows.ToList())
    context.DeleteObject(tw);

Или вы можете изменить базу данных и модель для поддержки идентифицирующего отношения (FK к родителю станет частью PK TimeWindow), и в этом случае ваш первый фрагмент кода будет работать.

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