繁体   English   中英

如何仅更新实体框架(核心)中的特定字段

[英]How to only update specific fields in Entity Framework (Core)

我正在编写一个应用程序,它从外部 API 提取数据,并使用实体框架将其存储到我的 SQL 服务器数据库中。 我每天都从这个 API 中提取数据,所以如果一行已经存在,则将更新记录,否则将创建一个新记录。 这是通过检查 Id 来完成的。

现在我遇到的问题是我只希望 EF 更新BranchIdCustomerNameTopdesk CustomerNamePRTG值是我自己手动添加到数据库中的。 所以现在当记录更新时,它被设置回 NULL 并且我手动插入的值将丢失。

更新前

在此处输入图像描述

更新后

后

API 中的数据从 JSON 反序列化,并作为List<Customers>.存储在data变量中。 我正在使用以下代码检查 Id 是否已经存在记录并更新它,否则创建一个新记录。 如您所见,它当前正在更新整个Customer记录,包括CustomerNamePRTG ,即 NULL

string apiResponse = await response.Content.ReadAsStringAsync();

var data = JsonConvert.DeserializeObject<List<Customers>>(apiResponse);

foreach (Customers customer in data)
{
    if (db.Customers.Any(x => x.BranchId == customer.BranchId))
    {
        db.Customers.Update(customer);
    }
    else
    {
        db.Customers.Add(customer);
    }

    db.SaveChanges();
}

Model

public class Customers
{
    [Key]
    [JsonProperty("id")]
    public string BranchId { get; set; }

    [JsonProperty("name")]
    public string CustomerNameTopdesk { get; set; }

    public string CustomerNamePRTG { get; set; }
}

数据库上下文

public DbSet<Customers> Customers { get; set; }

您必须更新 EF 返回的实体。

string apiResponse = await response.Content.ReadAsStringAsync();

var data = JsonConvert.DeserializeObject<List<Customers>>(apiResponse);

foreach (Customers customer in data)
{
    var current = db.Customers.Find(customer.BranchId);
    if (current != null)
    {
        db.Entry(current).CurrentValues.SetValues(customer);
    }
    else
    {
        db.Customers.Add(customer);
    }

    db.SaveChanges();
}

您应该只能将值分配给单个字段。

string apiResponse = await response.Content.ReadAsStringAsync();

var data = JsonConvert.DeserializeObject<List<Customers>>(apiResponse);

foreach (Customers customer in data)
{
    var record = db.Customers.Find(customer.BranchId);
    if (record != null)
    {
        record.BranchId = customer.BranchId;
        // as many fields as you need
 
        db.Customers.Update(record );
    }
    else
    {
        db.Customers.Add(customer);
    }

    db.SaveChanges();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM