Замок ActiveRecord построен на основе NHibernate, а функции AR во многом зависят от функций NHibernate. NHibernate содержит несколько генераторов первичного ключа:
1. native - это генератор по умолчанию. Если вы укажете это, то NHibernate автоматически выберет тип генератора на основе базовой базы данных. Например, если бы я использовал собственный вместо идентификатора в приведенном выше фрагменте сопоставления, вы все равно получите тот же SQL, потому что NHibernate достаточно умен, чтобы понимать, что базовая база данных SQL Server поддерживает столбцы идентификаторов. NHibernate преобразует возвращаемые значения с помощью метода Convert.ChangeType.
2. identity - Это можно использовать со столбцами Identity, предоставляемыми с SQL Server, MySQL, Sybase и т. Д.,
3. sequence - Firebird, DB2, PostgreSQL, Oracle, SAP DB поддерживает последовательности
4. increment - Этот генератор не использует никаких функций базы данных, таких как последовательность или идентичность. NHibernate автоматически увеличивает 1 до последнего значения первичного ключа. Этот генератор полезен при работе с единой системой баз данных, но не помогает в кластерной среде.
5. hilo - Алгоритм Hi / Lo используется для генерации значений первичного ключа. Это очень эффективно по сравнению с другими типами генераторов. Когда используется, NHibernate создает отдельную таблицу с именем hibernate_unique_key и создает столбец с именем next_hi, а затем NHibernate использует эту таблицу в качестве ссылки, когда происходит INSERT. Мы подробно поговорим об этом позже в этом посте.
6. uuid.hex - использует System.Guid и его метод ToString для генерации значений первичного ключа на основе строки.
7. guid - Это можно использовать, когда тип свойства класса - Guid.
8. guid.comb - аналогично guid, но использует другой алгоритм для получения значений первичного ключа. Обратите внимание, что uuid.hex, guid, guid.comb использует UNIQUEIDENTIFIER в качестве типа данных столбца в SQL Server.
9. назначено - последнее, но не менее важное, этот генератор предполагает, что значение первичного ключа назначено пользователем.
Итак, вы можете видеть, что таких встроенных функций нет. Для создания номера заказа вы можете использовать 2 способа:
1. выберите максимальный заказ и установите его вручную
2. добавить триггер вставки в базу данных
На мой взгляд, вы должны использовать первый способ, потому что таким образом вы не будете полагаться на базу данных. И вы можете повторно использовать эту функцию, когда вам нужно будет переместить объект вверх или вниз. Я обычно так использую.