2011-10-06 40 views
1

我遇到了實體框架的問題。我的代碼試圖從表中刪除一個或多個大於10的對象。Entity Framework的DeleteObject加載整個表?

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 

爲什麼實體框架加載所有的entites列表中? Straaange!

編輯:

當我改變了代碼:

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)」之前的代碼確實去了數據庫找到這個對象,但之後加載了整個表。

+0

是UserListId索引?不知道這是否是問題... –

+0

你是什麼意思的「加載列表中的所有entites」?它只在那裏選擇一個用戶,當然? – AakashM

+0

什麼是UserListId,爲什麼從'Users'加載'User'並將其從'Subscribers'集合中刪除? –

回答

0

下面的語句反正打電話給你的數據庫,這不是EF的一個奇怪的特點。 如果您在數據庫中的用戶表上創建了正確的主鍵,理想情況下它不需要更多時間。看來你缺少PK。

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