Foreign Key Constraint constructor 是否有一个衬里?
Is there a oneliner for ForeinKeyConstraint constructor?
我有这段代码需要重复很多次(dt_Areas
和 dt_Locations
是 DataTable
个对象):
ForeignKeyConstraint fkC =
new ForeignKeyConstraint(dt_Areas.Columns["Id"],
dt_Locations.Columns["AreaId"]);
fkC.DeleteRule = Rule.None;
fkC.UpdateRule = Rule.None;
在所有情况下,我的 DeleteRule
和 UpdateRule
必须相同。
所以我想,让我们寻找一个也包含规则定义的构造函数,这让我找到了这段代码:
dt_Locations.Constraints.Add(
new ForeignKeyConstraint("Location_Areas",
"Areas",
"",
new string[]{ "AreaId" },
new string[] {"Id" },
AcceptRejectRule.None,
Rule.None,
Rule.None));
这不起作用,因为 NullReferenceException
引用了 Constraints
属性,所以让我们解决这个问题:
dt_Locations.Constraints = new ConstraintCollection();
...
但这似乎是不允许的,从这个构建结果可以看出:
error CS0200: Property or indexer 'DataTable.Constraints' cannot be assigned to --
it is read only
首先,我不明白这是从哪里来的:按 F12 让我看到这段代码:
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
[ResCategoryAttribute("DataCategory_Data")]
[ResDescriptionAttribute("DataTableConstraintsDescr")]
public ConstraintCollection Constraints { get; }
属性 是 public 并且前几行中的开关不显示“只读”(至少我不理解)。
所以我的问题是:由于我有很多表要涵盖,我如何在运行时添加约束,最好使用单行代码?
要将该代码转换为单个语句,您只需要 object initialiser:
var fkC =
new ForeignKeyConstraint(dt_Areas.Columns["Id"],dt_Locations.Columns["AreaId"])
{
DeleteRule = Rule.None,
UpdateRule = Rule.None
};
... 这段代码可以将该约束添加到 DataTable.Constraints
属性:
dt_Locations.Constraints.Add(
new ForeignKeyConstraint(dt_Areas.Columns["Id"],
dt_Locations.Columns["AreaId"])
{ DeleteRule = Rule.None,
UpdateRule = Rule.None });
(出于可读性的原因,它被分成多行,但它可以很容易地写成一行。)
我有这段代码需要重复很多次(dt_Areas
和 dt_Locations
是 DataTable
个对象):
ForeignKeyConstraint fkC =
new ForeignKeyConstraint(dt_Areas.Columns["Id"],
dt_Locations.Columns["AreaId"]);
fkC.DeleteRule = Rule.None;
fkC.UpdateRule = Rule.None;
在所有情况下,我的 DeleteRule
和 UpdateRule
必须相同。
所以我想,让我们寻找一个也包含规则定义的构造函数,这让我找到了这段代码:
dt_Locations.Constraints.Add(
new ForeignKeyConstraint("Location_Areas",
"Areas",
"",
new string[]{ "AreaId" },
new string[] {"Id" },
AcceptRejectRule.None,
Rule.None,
Rule.None));
这不起作用,因为 NullReferenceException
引用了 Constraints
属性,所以让我们解决这个问题:
dt_Locations.Constraints = new ConstraintCollection();
...
但这似乎是不允许的,从这个构建结果可以看出:
error CS0200: Property or indexer 'DataTable.Constraints' cannot be assigned to --
it is read only
首先,我不明白这是从哪里来的:按 F12 让我看到这段代码:
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
[ResCategoryAttribute("DataCategory_Data")]
[ResDescriptionAttribute("DataTableConstraintsDescr")]
public ConstraintCollection Constraints { get; }
属性 是 public 并且前几行中的开关不显示“只读”(至少我不理解)。
所以我的问题是:由于我有很多表要涵盖,我如何在运行时添加约束,最好使用单行代码?
要将该代码转换为单个语句,您只需要 object initialiser:
var fkC =
new ForeignKeyConstraint(dt_Areas.Columns["Id"],dt_Locations.Columns["AreaId"])
{
DeleteRule = Rule.None,
UpdateRule = Rule.None
};
... 这段代码可以将该约束添加到 DataTable.Constraints
属性:
dt_Locations.Constraints.Add(
new ForeignKeyConstraint(dt_Areas.Columns["Id"],
dt_Locations.Columns["AreaId"])
{ DeleteRule = Rule.None,
UpdateRule = Rule.None });
(出于可读性的原因,它被分成多行,但它可以很容易地写成一行。)