Данные и связь между ними можно описать с помощью XML(не все конечно). С помощью XML Schema Definition можно определить структуру и типы данных для XML документа(но это пока, что всё находится в разработке, а пока рассмотрим то, что описано в SDK2).
Итак XSD schema(не могу перевести на русский) содержит элемент верхнего уровня "shema", который должен включать следующее пространство имён:
http://www.w3.org/2001/XMLSchema
Этот элемент может содержать определение типов(simpleType или complexType)
attribute и element - объявление. simpleType - обычный простой элемент не содержащий других complexType - может содержать другие элементы
Атрибуты minOccurs и maxOccurs определяют минимальное и максимально вхождение. Попробуем теперь описать нашу "базу". Прежде всего объявим нашу схему
<xsd:schema id="LeoDataSet" targetNamespace="" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
Далее объявим наш DataSet
<xsd:element name="ExampleDataSet" msdata:IsDataSet="true" msdata:Locale="ru-RU"> <xsd:complexType> <xsd:choice maxOccurs="unbounded">
Видим, что тип составной содержит другие элементы. Далее опишем в нём таблицы, я приведу пример небольшой только, остальной посмотрите в исподниках
<xsd:element name="Customers"> <xsd:complexType> <xsd:sequence> <xsd:element name="customer_id" msdata:AutoIncrement="true" type="xsd:int" minOccurs="0" /> <xsd:element name="name" msdata:ReadOnly="true" type="xsd:string" minOccurs="0" /> </xsd:sequence> </xsd:complexType> </xsd:element>
Всё довольно таки просто как мы видим. Теперь приступим к описанию ключей и ссылок. Опишем, что в таблице Customers customers_id это уникальное поле
<xsd:unique name="Constraint1"> <xsd:selector xpath=".//Customers" /> <xsd:field xpath="customer_id" /> </xsd:unique>
И осталось описать foregein key
<xsd:keyref name="orders" refer="Constraint1"> <xsd:selector xpath=".//Orders" /> <xsd:field xpath="customer_id" /> </xsd:keyref>
Полей в keyref может быть несколько, и они могут иметь одинаковые значения, но они должны однозначно определять одну запись. Теперь весь этот файл откомпилируем с помощью утилиты xsd. Запустим её следующим образом
xsd /d имяфайла.xsd
Где ключ /d определяет, что генерироваться будет класс DataSet. Мы получили класс унаследованный от DataSet. Имеющий поля таблицы(те в свою очередь поля). Теперь подключим файл к нашему проекту и изменим тип нашего dataset на наш. В принципе дальше можно было всё оставить без изменений, но я там изменил так, чтобы мы обращались к таблицам и столбцам из полученного dataset как к полям, что гораздо удобнее.