You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Web API如何仅查询并更新AdditionalDetailAbstract模型数据?

解决方案:仅更新AdditionalDetailAbstract字段避免性能问题

针对你的场景,核心是避免查询时加载不必要的FullDetails关联数据,同时高效更新AmountPaid字段,以下是几种实用方案:

1. 投影查询+跟踪更新(需先读取数据场景)

通过Select投影只获取AdditionalDetailAbstract包含的字段,EF不会加载关联的FullDetails,之后将投影对象附加到上下文并标记需要更新的字段:

// 投影到抽象类实例,仅获取需要的字段
var additionalData = dbContext.AdditionalDetail
    .Where(c => c.AdditionalDetailId == 525 && c.CompanyId == 15)
    .Select(c => new AdditionalDetailAbstract
    {
        AdditionalDetailId = c.AdditionalDetailId,
        DetailsId = c.DetailsId,
        CompanyId = c.CompanyId,
        AmountToBePay = c.AmountToBePay,
        AmountPaid = c.AmountPaid
    })
    .FirstOrDefault();

if (additionalData != null)
{
    // 修改AmountPaid字段
    additionalData.AmountPaid = 100.00m; // 替换为实际金额
    
    // 将实体附加到上下文并标记修改
    dbContext.Attach(additionalData);
    dbContext.Entry(additionalData).Property(x => x.AmountPaid).IsModified = true;
    
    dbContext.SaveChanges();
}

2. 直接执行更新操作(性能最优,无需查询实体)

如果不需要先读取当前数据,直接用EF的批量更新功能(EF Core 7+支持)或原生SQL,完全跳过实体加载步骤,适合大数据量场景:

EF Core 7+ 写法

dbContext.AdditionalDetail
    .Where(c => c.AdditionalDetailId == 525 && c.CompanyId == 15)
    .ExecuteUpdate(setters => setters
        .SetProperty(c => c.AmountPaid, 100.00m)); // 替换为实际金额

旧版本EF 原生SQL写法

dbContext.Database.ExecuteSqlRaw(
    "UPDATE AdditionalDetail SET AmountPaid = @amountPaid WHERE AdditionalDetailId = @id AND CompanyId = @companyId",
    new SqlParameter("@amountPaid", 100.00m),
    new SqlParameter("@id", 525),
    new SqlParameter("@companyId", 15));

3. 关闭延迟加载(全局/局部避免关联数据加载)

如果希望默认不加载关联数据,可以全局关闭延迟加载代理,或在局部查询时禁用:

全局关闭(DbContext配置)

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    optionsBuilder.UseSqlServer("你的连接字符串")
        .UseLazyLoadingProxies(false); // 关闭延迟加载
}

局部查询禁用

var additionalData = dbContext.AdditionalDetail
    .AsNoTracking() // 无需跟踪的话用这个,需要跟踪就去掉
    .Where(c => c.AdditionalDetailId == 525 && c.CompanyId == 15)
    .FirstOrDefault();

// 修改并保存
if (additionalData != null)
{
    additionalData.AmountPaid = 100.00m;
    dbContext.Entry(additionalData).Property(x => x.AmountPaid).IsModified = true;
    dbContext.SaveChanges();
}

内容的提问来源于stack exchange,提问作者Surendra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 21:07:05