Почему .Net DataTable.PrimaryKey игнорирует изменения в последовательности столбцов? - PullRequest
0 голосов
/ 15 февраля 2019

Я определяю DataTable с PrimaryKey, равным {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, не является основанием для того, чтобы утверждать, что Модель не нарушена, когда представление использует свойства модели.Видите ли, DataTable имеет свойство DefaultView, а DataView имеет свойство ApplyDefaultSort, которое позволяет просматривать данные в порядке .. (барабанная дробь) .. Первичный ключ (PK)!Это отлично подходит для просмотра пользователями, например, списка адресов клиентов, когда вы можете просматривать его по клиенту.Утверждение, что список адресов клиентов представляет собой набор информации без последовательности, смешно («Дайте мне всю первую строку адресов по клиенту, а затем всю вторую строку адресов по клиенту»).Я на самом деле хочу сравнить два набора данных и отобразить несовпадающие PK.Упорядочение PK в исходных наборах данных было создано людьми, которые, как и некоторые люди здесь, твердо верят, что порядок столбцов в первичном ключе не имеет значения;Получение списка несоответствующих адресов для клиентов, но отсортированных по типу адресной строки, не помогает, поэтому сначала я хочу заменить PK на CustomerID.Ага!Кто-то может сказать, просто удалите PK и переопределите его.Нет, это нарушает отношения FK в DataSets.

...