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变量值=空),所以明细表就会提示外键值为空。

扫一扫加微信


版权声明:本文为开发框架文库发布内容,转载请附上原文出处连接
NewDoc
C/S框架网