DeleteObject из Entity Framework загружает всю таблицу? - PullRequest
1 голос
/ 06 октября 2011

Я столкнулся с проблемой с Entity Framework. Мой код пытается удалить из таблицы 1 или более объектов, в большинстве случаев меньше 10.

foreach (var val in vals)
{
   int id = Convert.ToInt32(val);
   var item = _container.Users.First(x => x.Id == id);
   _container.Subscribers.DeleteObject(item);
}

_container.SaveChanges();

Текущая таблица «Пользователи» насчитывает около 20 000 строк. Когда я запускаю код, если он пытается удалить только одну сущность, это занимает около 10 секунд. Я отладил код и посмотрел в SQL Profiler. Все идет гладко, пока мы не нажмем метод DeleteObject (). Он отправляет этот SQL-запрос в базу данных:

exec sp_executesql N'SELECT 
-- Yada
FROM [dbo].[Users] AS [Extent1]
WHERE [Extent1].[UserListId] = @EntityKeyValue1',N'@EntityKeyValue1 int',@EntityKeyValue1=1

Почему структура сущностей загружает все объекты в списке? Straaange!

EDIT:

Когда я изменил код на:

int id = Convert.ToInt32(val);

Users u = new Users();
u.Id = Convert.ToInt32(val);

_container.Users.Attach(s);
_container.Users.DeleteObject(s);

Это работает как шарм! Еще. Код перед "_container.Users.First (x => x.Id == id)" отправился в базу данных, чтобы найти этот объект, но после этого загрузил всю таблицу.

1 Ответ

0 голосов
/ 08 февраля 2012

В любом случае нижеприведенное заявление делает вызов вашей базе данных, это не странная, а особенность EF. Если у вас есть правильный первичный ключ, созданный в таблице User в вашей базе данных, в идеале это не займет больше времени. Кажется, вам не хватает ПК.

var item = _container.Users.First (x => x.Id == id);

...