Набор данных ADO.NET - наличие уникального ограничения для столбцов из разных таблиц

Я пишу программу на 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 не упоминается несколько таблиц, и похоже, что никто другой этого не пробовал.


Я закончил с проблемой. В своей программе я уже использовал несколько проверок внешнего ключа, чтобы отслеживать, с какой таблицей имел дело. Я думал, что с этого момента будет проще сделать это по-другому, но я решил сохранить свои текущие методы (немного расширив их там, где это необходимо, например, добавив более подробную идентификационную информацию в другие компоненты моей программы), и это оказалось работать хорошо.

То, чем я закончил, на самом деле не решает мой вопрос, который я разместил здесь. Прошу прощения у гуглеров, надеющихся получить здесь ответ.


person pgn674    schedule 10.12.2010    source источник


Ответы (1)


В документации MSDN конкретно упоминается один DataTable:

Объект UniqueConstraint, который может быть назначен либо одному столбцу, либо массиву столбцов в DataTable (выделено мной)

Я не думаю, что вы сможете заставить DataTable обеспечить это за вас, вам придется принудительно применять поведение вручную.

person shf301    schedule 11.12.2010
comment
Как-то упустил это, когда прочитал это. Да, я действительно могу сделать это вручную. Странно, что у DataSet нет способа принудительно применить это для вас, как я думал, это будет обычным явлением. Я могу создать новую таблицу с единственной целью - иметь автоматически увеличивающийся столбец и отражать новые строки оттуда в любую таблицу, в которую я добавляю. - person pgn674; 12.12.2010
comment
@ pgn674: как бы вы это сделали в реальной базе данных? Это не так уж часто. - person John Saunders; 23.12.2010