2014-11-05 3 views
0

Использование EF6.1, я работаю с таблицей с составным ключом, как показано ниже:Усиление композитным ключом?

enter image description here

Как запустить метод upsert с помощью Entity Framework?

Я написал следующий метод, но я читал, что она не должна быть использована для upserts, только Миграции (не обращайте внимание на шаблон проектирования в настоящее время):

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

Я тоже не уверен что он работает правильно. Есть предположения? Я бы хотел избежать удаления и вставки, поскольку у нас есть таблица ведения журнала аудита для обновлений.

EDIT: Я написал следующий метод, который может справиться с этим - это предпочтительный подход?

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; не должны перезаписывать значения первичного ключа для existingMarketEntry. В этом случае он может не работать. – Jags

ответ

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}, людей); – cosset

+0

Thanks.Updated answer – Jags

+0

Однако код, который вы написали, может привести к уникальному нарушению индекса с одновременными условиями. См. Например, http://www.depesz.com/2012/06/10/why-is-upsert-so-complicated/ –

Смежные вопросы