ForeignKeyConstraint构造函数是否有单行写法添加外键约束?
问题根因
DataTable.Constraints仅定义了get访问器,属于只读属性,DataTable实例化时会自动初始化ConstraintCollection对象,无需手动赋值,手动赋值会直接触发CS0200编译错误。属性上的特性仅用于设计器、序列化场景的元数据标记,和是否只读无关。- 你使用的带表名、列名字符串参数的
ForeignKeyConstraint构造函数,依赖两张表已被添加到同一个DataSet且表名、列名和参数完全匹配的前提,否则会因为找不到对应列得到null对象,最终抛出NullReferenceException,这个异常和Constraints属性本身无关。
单行添加外键约束实现
直接使用接收DataColumn实例的构造函数重载,不依赖DataSet查找,所有场景通用:
dt_Locations.Constraints.Add(new ForeignKeyConstraint("Location_Areas", dt_Areas.Columns["Id"], dt_Locations.Columns["AreaId"], AcceptRejectRule.None, Rule.None, Rule.None));
如果需要批量处理大量表,可以把固定规则的逻辑封装为扩展方法复用,调用时更简洁:
// 扩展方法定义 public static class ForeignKeyConstraintExtensions { public static void AddNoneRuleForeignKey(this DataTable childTable, string constraintName, DataColumn parentKeyColumn, DataColumn childForeignKeyColumn) { childTable.Constraints.Add(new ForeignKeyConstraint(constraintName, parentKeyColumn, childForeignKeyColumn, AcceptRejectRule.None, Rule.None, Rule.None)); } } // 调用示例 dt_Locations.AddNoneRuleForeignKey("Location_Areas", dt_Areas.Columns["Id"], dt_Locations.Columns["AreaId"]);
内容的提问来源于stack exchange,提问作者Dominique
相关产品推荐
相关产品推荐

