首页 > 解决方案 > 将列表与数据库记录进行比较,如果存在 - 更新,如果新 - 创建(EF Core)

问题描述

我有一堂课,比方说(TimePassed 是表示经过秒数的 int 值):

public class DataLogModel
{
   public int Id { get; set; }
   public string LogName { get; set; }
   public int TimePassed { get; set; }
   public DateTime RecordDate { get; set; }
}

然后我在应用程序中向它添加数据。假设数据库中的数据如下所示(我的“数据库数据”记录中没有 ID,只能按名称和日期进行比较):

1 Signal received   40    14.4.2021
2 Procedure started 50    4.2.2021
3 Motor stopped     70    8.1.2021

然后我使用 EF Core 将此数据传递给数据库。在这个阶段,在通过之前,我需要检查数据库中是否已经存在某些记录,如果存在更新时间值,通过汇总到数据库中已经存在,如果记录是新的,则创建新项目。

我想出了这个解决方案,它能够添加新记录,但我无法让更新逻辑正常工作。我尝试了不同的解决方案,但没有一个有效。我最近的尝试可以在下面的代码中找到。很高兴得到一些提示如何做到这一点?

当前将数据记录到数据库的方法(没有更新逻辑工作,我已经在代码中注释了我的尝试)。我将新记录的列表作为方法中的参数传递:

public void ListToDatabase(IEnumerable<DataLogModel> trackedLogs)
{
  using (var db = new SQLDBContext.SQLDBContext())
  {
    // Here is my attempt with foreach, to get already existing records and update TimePassed value if found
    foreach (DataLogModel item in trackedLogs)
    {
      if (db.DataLogModel.Any(w => w.LogName == item.LogName && w.RecordDate == item.RecordDate.Date))
      {
        DataLogModel updateMe = db.DataLogModel
          .Where(w => w.LogName == item.LogName && w.RecordDate == item.RecordDate.Date).First();

        // Here I need to get existing record in database and summarize with
        // value for corresponding item from trackedLogs list passed as 
        // parameter to this method
        updateMe.TimePassed = updateMe.TimePassed + item.TimePassed;

        db.Update(db.ActivityLogModel);
      }
    }
    // Here is the end of my attempt

    // If no update needed below two lines works fine
    db.AddRange(trackedLogs);
    db.SaveChanges();
  }
}

标签: c#.netentity-frameworklinq

解决方案


你不能只使用这个模式吗?

foreach(var item in updates) {

    // search for existing entity.
    Entity entity = db.Entities.Where(x => x.keyValue == item.keyValue).FirstOrDefault();

    if(entity == null) {

        // no existing entity with this key value, insert.
        entity = new Entity(item);
        db.Entities.Add(entity);

    } else {
        // update existing entity.
        entity.property = item.property;
    }
}

db.SaveChanges();

推荐阅读