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

C#双表插入数据时tbl_resultados字段为null的问题

问题分析与解决方案

根据你提供的代码和问题描述,仅tbl_comprobantes_usr_curso插入成功、tbl_resultados插入失败且tbl_Resultado显示为null,可从以下几个方向排查和修复:

1. 优先排查异常详情

你代码中的catch块虽然记录了日志,但可能没有完整捕获tbl_resultados插入时的具体错误。建议在catch中添加即时输出,直接查看异常堆栈:

catch (Exception ex)
{
    Console.WriteLine($"插入失败异常:{ex.ToString()}"); // 临时添加调试输出,方便快速定位问题
    Log.FatalLog(
        LOG,
        MethodBase.GetCurrentMethod().Name,
        string.Format("Error al salvar la evaluación Usr {0} | Cuestionario {1} | fecha {2} | Aciertos {3} | Estatus {4}",
            resultadosModel.UsuarioId, resultadosModel.CuestionarioId, resultadosModel.FechaCreacion, resultadosModel.Aciertos, resultadosModel.Estatus),
        ex
    );
}

多数情况下,插入失败是因为数据库字段约束未满足(比如必填字段为null、数据类型不匹配),异常信息会直接指出问题所在。

2. 验证实体类与数据库表的匹配性

检查tbl_resultados实体类的定义,确保:

  • 所有数据库表中的**非空字段(NOT NULL)**在代码中都已赋值,比如id_usuario、id_cuestionario、fecha_creacion是否从resultadosModel获取到有效值,而非null。
  • 实体属性的数据类型与数据库字段完全兼容(比如aciertos是int类型,resultadosModel.Aciertos不能是null)。

3. 优化数据库操作的事务一致性

当前代码两次调用SaveChanges(),可能导致tbl_resultados插入失败时,tbl_comprobantes_usr_curso已经插入成功。建议使用事务包裹两个操作,保证原子性:

using (Entities db = new Entities())
{
    using (var transaction = db.Database.BeginTransaction())
    {
        try
        {
            db.tbl_resultados.Add(tbl_Resultado);
            db.tbl_comprobantes_usr_curso.Add(tbl_Comprobante);
            
            // 一次提交所有变更,避免部分成功的情况
            db.SaveChanges();
            transaction.Commit();
            
            is_ok = true;
            
            // 执行原有日志逻辑
            Log.InfoLog(
                LOG,
                MethodBase.GetCurrentMethod().Name,
                string.Format("Resultados de la evaluación guardados: usr {0} | cuestionario {1} | fecha {2}",
                    tbl_Resultado.id_usuario, tbl_Resultado.id_cuestionario, tbl_Resultado.fecha_creacion)
            );

            Log.InfoLog(
                LOG,
                MethodBase.GetCurrentMethod().Name,
                string.Format("Comprobante de evaluación guardado: usr {0} | curso {1} | fecha {2}",
                    tbl_Comprobante.id_usuario, tbl_Comprobante.id_curso, tbl_Comprobante.fecha_creacion)
            );
        }
        catch (Exception ex)
        {
            transaction.Rollback(); // 回滚所有操作,保证数据一致性
            Console.WriteLine($"异常回滚:{ex.ToString()}");
            Log.FatalLog(
                LOG,
                MethodBase.GetCurrentMethod().Name,
                string.Format("Error al salvar la evaluación Usr {0} | Cuestionario {1} | fecha {2} | Aciertos {3} | Estatus {4}",
                    resultadosModel.UsuarioId, resultadosModel.CuestionarioId, resultadosModel.FechaCreacion, resultadosModel.Aciertos, resultadosModel.Estatus),
                ex
            );
        }
    }
}

4. 调试确认对象初始化状态

在创建tbl_Resultado对象后添加断点,检查每个属性的取值:

// Crear objeto para tbl_resultados
tbl_resultados tbl_Resultado = new tbl_resultados()
{
    id_usuario = resultadosModel.UsuarioId,
    id_cuestionario = resultadosModel.CuestionarioId,
    fecha_creacion = resultadosModel.FechaCreacion,
    aciertos = resultadosModel.Aciertos,
    estatus = resultadosModel.Estatus
};
// 此处添加断点,查看tbl_Resultado的所有属性值是否符合预期

如果tbl_Resultado确实为null,大概率是tbl_resultados实体类的构造函数存在异常,导致new操作失败抛出异常(此时会直接进入catch块),需要检查实体类的构造函数代码。

5. 检查EF上下文配置

确认Entities上下文是否正确注册了tbl_resultados实体,没有遗漏映射或配置错误(比如上下文的DbSet<tbl_resultados>未定义)。


内容的提问来源于stack exchange,提问作者Miguel Ángel Silva Bata

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 11:21:13