【问题标题】:EF Core 3.1 select specific column and update itEF Core 3.1 选择特定列并更新它
【发布时间】:2020-08-29 17:39:28
【问题描述】:

我有一个表客户端,有两个几十列,我只需要更新一列。我没有加载整行,而是加载需要更新的列,而是更新值,然后调用 SaveChanges()。列未更新。以下是我的代码:

public async Task DeleteClients(IEnumerable<long> clientIds)
{
    var dbClients = await (from client in dbContext.Client
                           where clientIds.Contains(client.Id)
                           select new Client
                           {
                               Id = client.Id,
                               ClientStatusId = client.ClientStatusId
                           }).ToListAsync();

    dbClients.ForEach(dbClient =>
    {
        dbClient.ClientStatusId = (int)ClientStatusEnum.Deleted;
    });

    await unitOfWork.SaveAsync();
}

由于我没有使用 NoTracking,任何人都可以提出为什么它没有更新吗?

【问题讨论】:

    标签: c# .net .net-core entity-framework-core ef-core-3.1


    【解决方案1】:

    谁能指出它为什么不更新

    因为您不使用selectClient 实体,而只是投影Client 对象(所谓的存根)。投影对象,即使是实体类型,也不附加到上下文中。例如,您可以轻松创建没有键值的客户端。自动附加它们会将它们附加为Added,这不是您想要的。

    所以你必须明确地附加客户端:

        ...
    
        dbContext.Client.AttachRange(dbClients);
    
        dbClients.ForEach(dbClient =>
        {
            dbClient.ClientStatusId = (int)ClientStatusEnum.Deleted;
        });
    

    【讨论】:

    • 谢谢。那成功了。但是调用附加它如何找到条目是否已更改。我在数据库中没有看到任何额外的调用来获取原始值。
    • 这就是附加的作用。现在 EF 能够跟踪更改。您从数据库中获取基本的原始值。
    • 我明白这一点。但是,如果它没有原始值,它如何跟踪变化呢?我没有看到任何额外的调用来获取原始值
    • 这是您的第一个查询。 EF 知道ClientStatusId 并检测到它已更改。
    • 我最初没有收到的其他列呢?在新条目(我只选择两列)中,它们为空。不应该是那些用空值更新的吗?
    猜你喜欢
    • 2021-09-05
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    相关资源
    最近更新 更多