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)」之前的代碼確實去了數據庫找到這個對象,但之後加載了整個表。
是UserListId索引?不知道這是否是問題... –
你是什麼意思的「加載列表中的所有entites」?它只在那裏選擇一個用戶,當然? – AakashM
什麼是UserListId,爲什麼從'Users'加載'User'並將其從'Subscribers'集合中刪除? –