В большинстве случаев, разработчику не требуется использовать в работе напрямую первичные ключи, вся работа с ключами происходит скрытно. Однако, можно узнать (и изменить) значение первичного ключа объекта данных. Для этого необходимо вызвать у объекта данных свойство __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
перегрузкой всех его методов.