2014-11-05 56 views
0

使用EF6.1,我有一個表正與如下組合鍵:帶複合鍵的Upsert?

enter image description here

如何運行使用實體框架的更新插入方法?

我已經寫了下面的方法,但我讀過,它不應該被用於upserts,僅遷移(請忽略設計模式現在):

public void UpsertNumberOfMarkets(List<Entities.NumberOfMarkets> marketsList) 
{ 
    using (MyDbContext db = new MyDbContext()) 
    { 
     foreach (var market in marketsList) 
     { 
      db.NumberOfMarkets.AddOrUpdate(market); 
     } 
    } 
} 

我也不能確定它工作正常。有什麼想法嗎?我想避免刪除和插入,因爲我們有更新的審計日誌表。

編輯:我寫了下面的方法可以處理這個 - 這是首選的方法?

public void UpsertNumberOfMarkets(List<Entities.NumberOfMarkets> marketsList) 
{ 
    using (MyDbContext db = new MyDbContext()) 
    { 
     foreach (var market in marketsList) 
     { 
      var predicate = PredicateBuilder.True<Entities.NumberOfMarkets>(); 
      predicate = predicate.And(n => n.ProjectId == market.ProjectId); 
      predicate = predicate.And(n => n.Year == market.Year); 

      var existingMarketEntry = db.NumberOfMarkets.AsExpandable().Where(predicate).FirstOrDefault(); 

      if (existingMarketEntry != null) 
       existingMarketEntry.Markets = market.Markets; 
      else 
      { 
       db.NumberOfMarkets.Add(market); 
      } 
     } 
     db.SaveChanges(); 
    } 
} 
+0

唯一的事情就是existingMarketEntry.Markets = market.Markets;不應覆蓋現有MarketEntry的主鍵值。在這種情況下,它可能不起作用。 – Jags 2014-11-05 15:45:41

回答

1

Yes.AddOrUpdate應該僅被用於遷移下面原因

它更新被提供,但標記所有其他值作爲NULL(未設置),其可以不是該問題的所有值我們希望在現實世界中應用。

在你的情況,你可以在下面按照步驟

using (MyDbContext db = new MyDbContext()) 
     { 
      foreach (var market in marketsList) 
      { 
       var existingMarket = 
        db.Markets.FirstOrDefault(x => x.ProjectID == market.ProjectID && x.Year == market.Year); 
       if (existingMarket != null) 
       { 
        //Set properties for existing market 
        existingMarket.Year == market.Year 
        //etc 
       } 
       else 
       { 

        db.Markets.Add(market); 
       } 
       db.SaveChanges(); 
      } 
     } 
+1

第一個點不正確。您可以指定其他屬性而不是主鍵AddOrUpdate(p => new {p.FirstName,p.LastName},people); – cosset 2014-11-05 14:59:42

+0

Thanks.Updated the answer – Jags 2014-11-05 15:43:13

+0

但是,您編寫的代碼可能會導致唯一索引違反併發條件。參見例如http://www.depesz.com/2012/06/10/why-is-upsert-so-complicated/ – 2016-01-27 22:02:26