2016-11-15 33 views
0

我已經寫了一些代碼,應該檢查一行是否已經存在,如果沒有,就添加它,如果存在,它會添加它。之後它調用SaveChanges()函數。我只是想知道我是否做得對。使用實體框架在1次調用中添加/更新很多行

這是我的代碼。

using (var ctx = _context) 
    { 
     foreach (var item in objects) 
     { 
      Object existingRow = ctx.Objects.Where(x => x.Id == item.Id).FirstOrDefault(); 
      if (existingRow != null) 
       existingRow = item; 
      else 
       ctx.Objects.Add(item); 
     } 
     ctx.SaveChanges(); 
    } 

這裏是_context我的上下文到數據庫。

這樣做是否正確?執行SaveChanges()真的會導致只有1個調用,即使我添加了很多對象的上下文?

對象是一個可以有1000+個對象一樣大的列表。

非常感謝您的幫助!

+0

的SaveChanges將導致一個呼叫的方式,但「ctx.Objects.Where(X => X .Id == item.Id).FirstOrDefault()「也將導致對數據庫的查詢,並且對於1000個對象,這將是1000個調用。 – Evk

+0

檢查對象是否已經存在而不進行這些調用的最佳方法是什麼? – RandomStranger

+0

好吧,來自@SlavaUtesinov的回答是有效的,但現在已被刪除,不幸的是。您也可以使用AddRange(yourItems)將多個項目一次添加到上下文中(但即使使用AutoDetectChangesEnabled,它仍然是完全有效的答案),而不是更改AutoDetectChangesEnabled。 – Evk

回答

1

是的這就是你應該這樣做。 EF做的確切方式取決於內部算法,但通常格式良好。

另外,如果你想知道它是怎麼做的,或者你想改變EF不會的東西,你應該使用Interception

+1

謝謝!我對EF仍然很陌生,所以我一定會使用攔截! – RandomStranger