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

Bra*_*ram 7 c# entity-framework-core asp.net-core

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

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

更新前

在此输入图像描述

更新后

后

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

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();
}
Run Code Online (Sandbox Code Playgroud)

模型

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

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

    public string CustomerNamePRTG { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

数据库上下文

public DbSet<Customers> Customers { get; set; }
Run Code Online (Sandbox Code Playgroud)

Svy*_*liv 7

您必须更新 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();
}
Run Code Online (Sandbox Code Playgroud)


Pir*_*ate 5

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

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();
}
Run Code Online (Sandbox Code Playgroud)