带复合键的Upsert?
问题描述:
使用EF6.1,我有一个表正与如下组合键:带复合键的Upsert?
如何运行使用实体框架的更新插入方法?
我已经写了下面的方法,但我读过,它不应该被用于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();
}
}
答
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();
}
}
唯一的事情就是existingMarketEntry.Markets = market.Markets;不应覆盖现有MarketEntry的主键值。在这种情况下,它可能不起作用。 – Jags 2014-11-05 15:45:41