2012-04-09 56 views
0

我有一組實體,我不知道它們是否已經存在於數據庫中。 如果它們存在 - 我需要更新它們,如果它們不存在 - 我需要添加它們(對於每個實體它可能是一個或另一個,並且其中有10000個...)在不知道它是否存在的情況下添加或更新實體

(scenario - 我從文件導入數據,如果我導入相同的文件 - 如果文件被更改,什麼都不應該發生 - 我需要更新)。

我可以與實體框架實現,而不必搜索每個實體之前,我想補充的?

(如果我想補充 - 我需要使用ADDOBJECT,如果我想修改 - 我需要使用附加和ChangeObjectState)。

有沒有辦法避免搜索 - 比做的2個選項嗎?

(尋找「添加或更新」的方式....)

謝謝。

回答

1

號在EF,你必須知道,如果你想插入或更新實體=>如果你不知道它,你必須先搜索數據庫。您可以通過不使用EF直接使用SQL來降低複雜性,但在決定插入或更新之前,仍然必須搜索實體。在直接SQL的情況下,這可以在單個數據庫往返中完成(SQL Server 2008提供了特殊命令MERGE),而EF需要單獨的往返搜索和單獨的往返更新或插入。

編輯:具有更好的性能另一種解決辦法是通過一些快速的方式來獲取所有數據的數據庫 - 例如通過存儲過程與表值參數或批量插入填充臨時表。一旦你在一些處理表中有所有記錄,你可以使用SQL來更新現實表中存在的所有記錄,並插入所有不存在的記錄。

+0

這可能是一個很好的解決方案,以保持所有數據,但我將不得不重新構造我的應用程序。因爲我有很多呼叫更新/添加,我不想加載每個電話的一切。我也會尋找@tdykstra解決方案,我沒有從我的ObjectContext中得到這個,我不知道如何移動到DBContext及其含義。明天會有更多信息。 – Dani 2012-04-09 22:04:49

+0

去抓取。我有這個應用程序的5個實例。併發性可能發生.... – Dani 2012-04-10 09:03:56

1

如果可以使用的DbContext API(EF 4.3和EF 5),則可以使用AddOrUpdate方法。你得到展示這種方法的使用,當您啓用遷移,或者你可以在這個舊的博客文章從EF隊看一個例子代碼示例:

http://blogs.msdn.com/b/adonet/archive/2012/01/12/ef-4-3-beta-1-automatic-migrations-walkthrough.aspx

+0

將研究它。我明天再報告。 – Dani 2012-04-09 21:51:05

+3

但是這個解決方案正是@Dani不想做的。每次調用'AddOrUpdate'內部執行查詢來檢查數據庫中是否存在實體。此外,它使用了一些額外的反映,因此它是所有人中最慢的解決方案,[它只能在遷移中使用](http://thedatafarm.com/blog/data-access/take-care-with-ef-4-3 -addorupdate-方法/)。順便說一句。它也不是爲併發應用程序設計的,因爲在調用AddOrUpdate和SaveChanges之間的延遲時,其他線程/應用程序可以添加該實體。 – 2012-04-09 22:19:11

相關問題