Я пишу программу на C # в .NET 3.5 в Visual Studio 2008. У меня есть DataSet с двумя таблицами данных, A и B. В таблице A - DataColumn Y, а в таблице B - столбец Z, плюс еще несколько столбцов в обеих таблицах. Оба столбца Y и Z настроены как уникальные столбцы с автоинкрементом.
Я бы хотел, чтобы Y и Z были уникальными между ними двумя. Например, если в таблице A уже есть строка с 3 в столбце Y, и я создаю новую строку в таблице B, и она хочет поместить 3 в столбец Z в этой новой строке, вместо этого она пропустит 3 и вставьте 4.
Я пробовал кое-что, похоже, должно работать:
myDataSet.Tables["A"].Constraints.Add(new UniqueConstraint(new DataColumn[] { myDataSet.Tables["A"].Columns["Y"], myDataSet.Tables["B"].Columns["Z"] }));
myDataSet.Tables["B"].Constraints.Add(new UniqueConstraint(new DataColumn[] { myDataSet.Tables["A"].Columns["Y"], myDataSet.Tables["B"].Columns["Z"] }));
Но я получаю следующую ошибку в первой строке, если я запускаю приложение, и оно переходит к этому коду:
System.Data.InvalidConstraintException не было обработано
Message = "Невозможно создать ключ из столбцов, принадлежащих разным таблицам."
Source = "System.Data"
Причина, по которой я добавляю одно и то же значение UniqueConstraint в обе таблицы, заключается в том, что я не совсем уверен, где еще его разместить, чтобы он стал активным. Я бы предпочел не объединять таблицы в одну, поскольку они имеют мало общего друг с другом, кроме столбцов Y и Z.
Кто-нибудь знает как это сделать? В документации MSDN не упоминается несколько таблиц, и похоже, что никто другой этого не пробовал.
Я закончил с проблемой. В своей программе я уже использовал несколько проверок внешнего ключа, чтобы отслеживать, с какой таблицей имел дело. Я думал, что с этого момента будет проще сделать это по-другому, но я решил сохранить свои текущие методы (немного расширив их там, где это необходимо, например, добавив более подробную идентификационную информацию в другие компоненты моей программы), и это оказалось работать хорошо.
То, чем я закончил, на самом деле не решает мой вопрос, который я разместил здесь. Прошу прощения у гуглеров, надеющихся получить здесь ответ.