使用复合键进行升级?

时间:2014-11-05 14:32:35

标签: c# entity-framework

使用EF6.1,我正在使用带有复合键的表,如下所示:

enter image description here

如何使用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();
    }
}

1 个答案:

答案 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();
            }
        }