ASP.NET Core Web API如何将JSON序列化数据与普通字段同步入库
实现方案
你需要调整实体映射逻辑,在VM转数据库实体的阶段直接完成JSON序列化赋值,无需分两次操作,具体步骤如下:
1. 先确认数据库实体配置合规
确保LoanInfo实体的LoanData字段没有被EF Core标记为忽略,且字段类型为可容纳JSON字符串的长文本类型:
public class LoanInfo { public int Id { get; set; } public int LoanType { get; set; } public decimal LoanAmount { get; set; } public int Installments { get; set; } // 禁止添加[NotMapped]特性,FluentAPI中不能配置Ignore(x=>x.LoanData) public string LoanData { get; set; } }
2. 修改EntityMapper映射逻辑
直接在映射阶段把VM的三个字段序列化后赋值给实体的LoanData属性,分两种常见映射场景:
手动映射场景
public static class EntityMapper { public static LoanInfo ToEntity(this LoanInfoVM vm) { return new LoanInfo { LoanType = vm.LoanType, LoanAmount = vm.LoanAmount, Installments = vm.Installments, // 直接序列化目标字段赋值 LoanData = System.Text.Json.JsonSerializer.Serialize(new { vm.LoanType, vm.LoanAmount, vm.Installments }) }; } }
AutoMapper映射场景
public class LoanProfile : Profile { public LoanProfile() { CreateMap<LoanInfoVM, LoanInfo>() .ForMember(dest => dest.LoanData, opt => opt.MapFrom(src => System.Text.Json.JsonSerializer.Serialize(new { src.LoanType, src.LoanAmount, src.Installments }) )); } }
3. 保持原有业务服务逻辑不变
映射完成后直接调用仓储的保存方法,即可一次提交完成所有字段入库,无需额外修改:
public class LoanService { private readonly ILoanRepository _loanRepo; // private readonly IMapper _mapper; AutoMapper场景注入 public async Task AddLoan(LoanInfoVM request) { // 模型校验逻辑省略 var loanEntity = request.ToEntity(); // 手动映射写法 // var loanEntity = _mapper.Map<LoanInfo>(request); AutoMapper写法 await _loanRepo.AddAsync(loanEntity); await _loanRepo.SaveChangesAsync(); } }
常见问题排查
- 若仍无法入库,检查数据库表
LoanData字段长度,默认nvarchar(max)可满足需求,避免短长度导致字符串截断 - 若项目用Newtonsoft.Json做序列化,替换
System.Text.Json.JsonSerializer.Serialize为JsonConvert.SerializeObject即可 - 不需要先存三个字段再回写
LoanData,映射阶段直接赋值即可实现一次事务提交所有数据
内容的提问来源于stack exchange,提问作者Olugbenga
相关产品推荐
相关产品推荐

