ASP.NET Core Web API 如何将Mandate属性组合为JSON存入TransactionLog的RawData列
实现方案与现有逻辑调整说明
1. RawData 序列化实现
你可以直接用ASP.NET Core内置的System.Text.Json序列化库,把Mandate对应的三个日期字段序列化为JSON字符串赋值给RawData。如果项目用的是Newtonsoft.Json,替换为JsonConvert.SerializeObject方法即可。
2. 现有逻辑需要调整的核心问题
- 变量命名冲突:
Post方法的参数名和局部变量名都是mandate,会直接编译报错 - 外键关联缺失:Mandate的Id是自增主键,插入数据库后EF才会生成主键值,你需要主动关联Mandate和TransactionLog,否则TransactionLog的MandateId会为空,插入数据库失败
- 异常处理不合理:当前捕获异常后重新抛出新异常会丢失原始栈信息,不利于问题排查
- 实体定义错误:TransactionLog的MandateId是主键,不能定义为可空类型
int?,需要改为非空int
完整修改代码示例
修正TransactionLog实体定义
public class TransactionLog { [Key, ForeignKey("Mandate")] public int MandateId { get; set; } // 改为非空int public string RawData { get; set; } public virtual Mandate Mandate { get; set; } }
修正EntityMapper实现
using System.Text.Json; public class EntityMapper { public Mandate FromMandateDtoToMandate(MandateDto mandateDto) { return new Mandate { DueDate = mandateDto.DueDate, StartDate = mandateDto.StartDate, EndDate = mandateDto.EndDate }; } public TransactionLog FromMandateDtoToTransactionLog(MandateDto mandateDto) { // 序列化三个日期字段为JSON var rawData = JsonSerializer.Serialize(new { mandateDto.DueDate, mandateDto.StartDate, mandateDto.EndDate }); return new TransactionLog { RawData = rawData, }; } }
修正MandateService的Post方法
public async Task<Mandate> Post(MandateDto mandateDto) { var mapper = new EntityMapper(); var mandateEntity = mapper.FromMandateDtoToMandate(mandateDto); var transactionEntity = mapper.FromMandateDtoToTransactionLog(mandateDto); // 关联两个实体,EF会自动处理外键赋值 mandateEntity.TransactionLog = transactionEntity; try { // 只需要插入Mandate,关联的TransactionLog会被EF自动级联插入 await _unitOfWork.MandateRepository.Insert(mandateEntity); await _unitOfWork.SaveChangesAsync(); } catch (Exception e) { // 直接抛出保留原始异常栈,不要new Exception丢失信息 throw; } return mandateEntity; }
内容的提问来源于stack exchange,提问作者Olugbenga
相关产品推荐
相关产品推荐

