2012-01-15 103 views
2

這個實體框架調用實際上是兩次訪問數據庫嗎?實體框架 - 在DeleteObject上有多少次數據庫訪問

var result = from p in entities.people where p.id == 6 select p; 
    entities.DeleteObject(result); 

它讓我覺得,也許DeleteObject會強制第一次旅行得到結果,然後,讓對象使用,將執行刪除功能。

如果是這樣的話,我該如何避免第二次旅行?如何在單個數據庫之旅中通過實體框架進行查詢刪除?

謝謝!

編輯

我原來的例子是誤導,因爲它是通過主鍵查詢。我想真正的問題是,是否有一種方法可以使用可以從IQueryable中刪除項目的單行程功能。例如:

var result = from p in entities.people where p.cityid == 6 select p; 

    foreach (var r in result) 
    { 
     entities.DeleteObject(r); 
    } 

(注意查詢是外鍵,所以可能有多個結果)。

+1

這已被問 - 此答案http://stackoverflow.com/questions/869209/bulk-deleting-in-linq-to-entities/870081#870081鏈接到文章描述如何實現批量更新'UPDATE ... SET ... WHERE ...'的形式,你應該能夠適應創建'DELETE ... WHERE ...'查詢。 – hvd 2012-01-15 22:42:59

回答

1

直接刪除:

var people = new people() { id = 6 }; 
entities.people.Attach(people); 
entities.people.Remove(people); 
entities.SaveChanges(); 

如果你想看到它自己,fire up a profiler

編輯:

這將允許你使用LINQ的,但它不會是一個旅程。

var peopleToDelete = entities.people.Where(p => p.id == 6); 

foreach (var people in peopleToDelete) 
    entities.people.DeleteObject(people); 

entities.SaveChanges(); 

有沒有簡單的方法來做到這一點出EF箱子,一個大麻煩確實(只要一個不希望訴諸使用直接SQL,其中我個人不)。其他海報中的一個鏈接到一個答案,該鏈接又鏈接到this article,該文件描述了一種使用ToTraceString來創建自己的功能的方法。

+0

感謝diggingforfire。請參閱我的編輯 - 雖然我的原始問題不夠具體。 – carlbenson 2012-01-15 22:23:19

+0

我對延遲執行的理解是,foreach,如你的例子,是一個強制數據庫調用的觸發器。查看:http://blogs.msdn.com/b/charlie/archive/2007/12/09/deferred-execution.aspx – carlbenson 2012-01-15 23:07:30

+0

我應該澄清我的意思是'最好的賭注',因爲這仍然是指能夠使用Linq,而不是單程。我已經更新了我的答案。 – diggingforfire 2012-01-15 23:17:46

1

你可以這樣說:

entities.ExecuteStoreCommand("DELETE FROM people WHERE people.cityid={0}", 6); 

這是一個訪問數據庫是肯定的,有效的,因爲它可以。

編輯: 另外,看看here,他們建議相同的解決方案。回答這個問題,這是從數據庫中使用實體框架刪除沒有被主鍵引用的實體的唯一方法,而不需要獲取這些實體(並且沒有寫入如this答案中建議的一些輔助擴展方法)。

+0

我確定直接執行'DELETE' SQL語句是一次旅行,但它不回答問題。 – diggingforfire 2012-01-15 22:36:50

+0

你說得對。我已經更新了答案,直接回答了問題。 – 2012-01-15 22:43:34