c# - 将列表与数据库记录进行比较,如果存在 - 更新,如果新 - 创建(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();
}
}
解决方案
你不能只使用这个模式吗?
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();
推荐阅读
- java - 表格列标题未显示在 Wicket 的 TableTree 中
- python - 'WHERE...IN' 子句的问题
- java - 在不下载的情况下发送文件作为响应
- amazon-web-services - 如何在 AWS CloudFormation 模板中为新的 SecurityGroup 使用现有 VPC
- python - discord.ext.commands.errors.ExtensionFailed:扩展“cogs.cloud”引发错误:ValueError:尝试相对导入超出顶级包
- c# - 如何在 Identity Server 4 中使用主域进行 Openid 身份验证?
- google-app-engine - 如何为 Google Cloud App Engine 提供额外的 JDBC 属性
- python - 为表格数据构建自动编码器
- javascript - Potree-Core:未定义三个
- kubernetes - 处理多容器场景下 Kubernetes 中 Pod 的优雅终止