带复合键的Upsert?

问题描述:

使用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

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