Генератор, типы и правила генерации первичных ключей

В большинстве случаев, разработчику не требуется использовать в работе напрямую первичные ключи, вся работа с ключами происходит скрытно. Однако, можно узнать (и изменить) значение первичного ключа объекта данных. Для этого необходимо вызвать у объекта данных свойство __PrimaryKey.

Генератор первичных ключей

Первичные ключи объектов генерируются методом ICSSoft.STORMNET.KeyGen.KeyGenerator.Generate. При этом Flexberry ORM не знает, какой именно используется генератор и каков тип первичного ключа. Конкретный генератор прописывается в класс объекта данных атрибутом KeyGeneratorAttribute.

Генератор может быть двух типов:

  • Возвращать ключи, уникальные абсолютно.
  • Возвращать ключи, уникальные в пределах рабочей станции.

Если генератор второго типа, он должен имплементировать метод Unique возвратом false, иначе true.

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

Данная особенность является способом оптимизации, поскольку абсолютно уникальные ключи могут быть сложны в генерации и длинны, а постоянная сверка с общим генератором низкопроизводительна.

В настоящее время реализован генератор ICSSoft.STORMNET.KeyGen.GUIDGenerator, возвращающий длинный ключ первого типа. Этот генератор используется по-умолчанию, прописан атрибутом KeyGeneratorAttribute непосредственно классу DataObject. Разработчик может узнать тип генератора ключей для конкретного класса данных вызовом Information.GetKeyGeneratorType.

Изменение типа и правил генерации первичного ключа

При необходимости разработчик может изменить тип первичного ключа и закон его генерации, поскольку первичный ключ во Flexberry ORM может быть любого типа.Важно, чтобы тип первичного ключа поддерживал следующее:

  • Метод ToString() для конвертации в строку и статический метод Parse(string) для обратного получения из строки ключа.
  • Реализовывать интерфейс System.IСomparable.
  • Поддерживать неявное (imlicit) преобразование в string и обратно.
  • Поддерживать неявное (imlicit) преобразование к целевому типу хранения и обратно.

Все генераторы ключей должны наследоваться от абстрактного класса ICSSoft.STORMNET.KeyGen.BaseKeyGenerator перегрузкой всех его методов.