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

