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
相关产品推荐
相关产品推荐

