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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 07:54:04