C/S开发框架DAL层提交数据报错"外键值为空!"解决方案。
C/S开发框架DAL层提交数据报错"外键值为空!"解决方案。
提交数据时发生如下错误:

UpdateDetailKey方法负责更新明细表的外键值,抛出异常的代码逻辑:
C# Code:
/// <summary>
/// 更新明细表的外键
/// </summary>
/// <param name="detail">明细表</param>
/// <param name="foreignFieldName">外键字段名称</param>
/// <param name="foreignKeyValue">外键值</param>
protected void UpdateDetailKey(DataTable detail, string foreignFieldName, string foreignKeyValue)
{
if (detail == null)
throw new Exception("明细表不能为空(null)!");
if (String.IsNullOrEmpty(foreignFieldName))
throw new Exception("明细表没指定外键, 请检查表模型定义!");
foreach (DataRow row in detail.Rows)
{
//仅新增记录才需要更新外键,注意状态的使用
if (row.RowState == DataRowState.Added)
{
if (String.IsNullOrEmpty(foreignKeyValue))
throw new Exception("外键值为空!");
else
row[foreignFieldName] = foreignKeyValue;
}
}
}
//来源:C/S框架网 | www.csframework.com | QQ:23404761
/// 更新明细表的外键
/// </summary>
/// <param name="detail">明细表</param>
/// <param name="foreignFieldName">外键字段名称</param>
/// <param name="foreignKeyValue">外键值</param>
protected void UpdateDetailKey(DataTable detail, string foreignFieldName, string foreignKeyValue)
{
if (detail == null)
throw new Exception("明细表不能为空(null)!");
if (String.IsNullOrEmpty(foreignFieldName))
throw new Exception("明细表没指定外键, 请检查表模型定义!");
foreach (DataRow row in detail.Rows)
{
//仅新增记录才需要更新外键,注意状态的使用
if (row.RowState == DataRowState.Added)
{
if (String.IsNullOrEmpty(foreignKeyValue))
throw new Exception("外键值为空!");
else
row[foreignFieldName] = foreignKeyValue;
}
}
}
//来源:C/S框架网 | www.csframework.com | QQ:23404761
解决方案:
1. 检查明细表对应的模型类,ORM_TableAttribute特性的isSummaryTable参数必须是false;
2. 检查明细表对应的模型类的外键字段,如下图的ARNO,必须设isForeignKey=True;

3. 检查主表对应的模型类,ORM_TableAttribute特性的isSummaryTable参数必须是True;
4. dalBaseBusiness.Update方法传入的是DataSet对象,提交的DataSet数据没有包含主表(或者主表没有修改数据),无法获取到主表的主键值(mDocNo变量值=空),导致外键赋值失败,抛出“外键值为空!”异常。
关于第4点(主表),用户反馈的原因是:
主从表结构的必须得有CreationDate\CreatedBy\LastUpdateDate\LastUpdatedBy 这四个字段。特别是主表,如果没有LastUpdateDate\LastUpdatedBy的话,保存时主表没有数据变动,单号不会抛出来(mDocNo变量值=空),所以明细表就会提示外键值为空。

参考文档:
CSFramework.CodeGeneratorV6.0|将窗体(Form)源码加入到VS解决方案|C/S开发框架
代码生成器:直连模式+WebApi生成的源码集成到VS解决方案|C/S开发框架
CSFrameworkV6旗舰版 | 基础资料窗体改装主从子表(多级明细表)解决方案|C/S开发框架
标准主从表界面增加一个明细表解决方案(不变更BusinessData模型的情况下)|C/S开发框架
CSFrameworkV6|业务单据数据查询页面显示主从表关联数据解决方案|C/S开发框架
MiniFramework蝇量框架 Visual Studio解决方案|C/S开发框架
VS解决方案与目录结构 | CSFramework.WebApi后端框架|C/S开发框架
WCF开发框架-IIS启用net.tcp协议发现不会自动执行Global应用程序解决方案
CSFramework快速开发框架项目改名VS解决方案改名(使用Rename改名工具)
C#.Net快速开发框架 - ORM ,BLL,DAL三者关系
C/S开发框架:系统数据库与账套数据库合并解决方案|C/S开发框架
EFCore+Scheme(数据库架构)实现分库分表支持多种主流数据库解决方案|C/S开发框架
达梦数据库使用DmBulkCopy批导数据解决方案|C/S开发框架
OracleException:“ORA|00942: 表或视图不存在”解决方案|C/S开发框架
CSFramework.CodeGeneratorV6.0|将项目模块(Project)添加到VS解决方案|C/S开发框架
SQLSERVER:误删Windows登录用户而sa禁用,导致无法使用Windows身份验证解决方案|C/S开发框架
CSFramework.CodeGeneratorV6.0|将窗体(Form)源码加入到VS解决方案|C/S开发框架
代码生成器:直连模式+WebApi生成的源码集成到VS解决方案|C/S开发框架
CSFrameworkV6旗舰版 | 基础资料窗体改装主从子表(多级明细表)解决方案|C/S开发框架
标准主从表界面增加一个明细表解决方案(不变更BusinessData模型的情况下)|C/S开发框架
CSFrameworkV6|业务单据数据查询页面显示主从表关联数据解决方案|C/S开发框架
MiniFramework蝇量框架 Visual Studio解决方案|C/S开发框架
VS解决方案与目录结构 | CSFramework.WebApi后端框架|C/S开发框架
WCF开发框架-IIS启用net.tcp协议发现不会自动执行Global应用程序解决方案
CSFramework快速开发框架项目改名VS解决方案改名(使用Rename改名工具)
C#.Net快速开发框架 - ORM ,BLL,DAL三者关系
C/S开发框架:系统数据库与账套数据库合并解决方案|C/S开发框架
EFCore+Scheme(数据库架构)实现分库分表支持多种主流数据库解决方案|C/S开发框架
达梦数据库使用DmBulkCopy批导数据解决方案|C/S开发框架
OracleException:“ORA|00942: 表或视图不存在”解决方案|C/S开发框架
CSFramework.CodeGeneratorV6.0|将项目模块(Project)添加到VS解决方案|C/S开发框架
SQLSERVER:误删Windows登录用户而sa禁用,导致无法使用Windows身份验证解决方案|C/S开发框架
其它资料:
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 |
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 |
在线客服
