为什么.Net DataTable.PrimaryKey忽略对列顺序的更改?

时间:2019-02-15 02:40:55

标签: .net vb.net datatable primary-key

我定义了一个主键为{Key1,Key2}的数据表(实际上是预定义的;我没有发言权)。然后,我想将其更改为{Key2,Key1},但不是。仍然是{Key1,Key2}。请注意,我可以先更改为{Key3,key1},然后再更改为{Key2,Key1},但这当然可以,但前提是只有Key3,Key1是唯一的。样本单元测试...

    <TestMethod()> Public Sub THC0841A_DS_AddPrimaryKey_Multi_Change()
    Dim ds As New DataSet
    Assert.AreEqual(True, ds.EnforceConstraints)
    Dim dt As New DataTable("MyTable"), dr As DataRow
    ds.Tables.Add(dt)
    dt.Columns.Add("Key1", GetType(String))
    dt.Columns.Add("Key2", GetType(Decimal))
    dt.Columns.Add("Value", GetType(String))
    dt.Rows.Add("A", 11D, "A-11-V")
    dr = dt.Rows.Add({"A", 22D, "A-22-V"})

    dt.PrimaryKey = {dt.Columns("Key1"), dt.Columns("Key2")}
    Assert.AreEqual("Key1,Key2", String.Join(",", From item In dt.PrimaryKey Select $"{item.ColumnName}"))

    dt.Rows.Add("E", 9D, "E-9-V")

    'now change PK
    Assert.AreEqual("Key1,Key2", String.Join(",", From item In dt.PrimaryKey Select $"{item.ColumnName}"))
    dt.PrimaryKey = {dt.Columns("Key2"), dt.Columns("Key1")}
    Assert.AreEqual("Key2,Key1", String.Join(",", from item In dt.PrimaryKey Select $"{item.ColumnName}"), "NO! this fails!")
    dt.PrimaryKey = {dt.Columns("Value"), dt.Columns("Key1")}
    Assert.AreEqual("Value,Key1", String.Join(",", From item In dt.PrimaryKey Select $"{item.ColumnName}"))
    dt.PrimaryKey = {dt.Columns("Key2"), dt.Columns("Key1")}
    Assert.AreEqual("Key2,Key1", String.Join(",", From item In dt.PrimaryKey Select $"{item.ColumnName}"))
End Sub

编辑

哦,亲爱的;我希望保持这种简单性,而不是冒险尝试哲学上的“集合没有顺序”和“交换密钥顺序没有影响”。仅仅因为MS无法正确执行MVC,就没有理由说当View使用Model的属性时Model没有被破坏。 您会看到,DataTable具有DefaultView属性,而DataView具有ApplyDefaultSort属性,该属性使您可以按..(鼓卷)..主键(PK)顺序查看数据!当您可以按客户查看客户地址列表时,这非常适合查看用户的列表。说客户地址列表是没有顺序的一组信息是荒谬的(“给我所有客户的第一行地址,然后给客户所有第二行地址”)。我实际上是想比较两个数据集并显示不匹配的PK。原始数据集中的PK顺序是由那些像这里的人一样坚信主键中的列顺序无关紧要的人创建的。获取客户不匹配地址的列表,但按地址行类型排序是没有帮助的,因此我想先将PK交换为CustomerID。啊哈!有人可能会说,只需删除PK并重新定义它即可。不,这破坏了数据集中的FK关系。

0 个答案:

没有答案