使用EF6.1,我正在使用带有复合键的表,如下所示:
如何使用Entity Framework运行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();
}
}
答案 0 :(得分:1)
是.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();
}
}