【发布时间】:2014-11-05 14:32:35
【问题描述】:
使用 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();
}
}
【问题讨论】:
-
唯一的问题是existingMarketEntry.Markets = market.Markets;不应覆盖现有市场条目的主键值。在这种情况下,它可能不起作用。
标签: c# entity-framework