Установите для Identity Seed значение 0 с помощью NHibernate SchemaExport

Я использую класс SchemaExport в NHibernate для создания базы данных из файлов .hbm.xml. Есть ли способ установить Identity Seed на моих таблицах на 0, а не на 1? Для таблиц ссылок я предпочитаю, чтобы все идентификаторы исходного статуса были равны 0, и я не хочу, чтобы мне приходилось сбрасывать это значение каждый раз, когда я регенерирую свою БД в режиме разработки. Я использую SQL Server 2005, NHibernate версии 1.2.1.


person Mark Struzinski    schedule 27.03.2009    source источник


Ответы (1)


По возможности лучше НЕ использовать столбцы Identity с NHibernate; Они заставляют NHibernate делать больше обращений к базе данных, делать пакетирование невозможным и, по сути, нарушать шаблон Unit of Work. Это обсуждается на nhibernate.info и в нескольких сообщения в блоге, подобные этой. Guid.comb или Hi-Lo обычно лучше.

Если вы действительно хотите продолжать использовать Identity и иметь начальное значение с 0, то вот некоторые возможности (не проверены).

Просто предположение, но вам, вероятно, сначала нужно установить свой unsaved-value="-1" следующим образом:

Это позволяет NHibernate знать, что идентификатор -1 означает, что объект не сохранен (временный).

Вам также необходимо убедиться, что все идентификаторы Entities также имеют значение по умолчанию -1 (числа, очевидно, по умолчанию равны 0):

public class Order {
    public virtual long Id{get; private set;}
    public Order(){
      Id = -1;
    }
}

Это довольно противно! Затем нужно выяснить, как получить SchemaExport для начального значения из 0. Он может это уже сделать (используя несохраненное значение +1 в качестве начального значения)? Проверьте, работает ли это. В противном случае вам может потребоваться исправить его или переопределить hbm.xml. Один из способов - использовать XSLT для преобразования сгенерированных файлов HBM. Опять же, довольно противно.

person tobinharris    schedule 30.03.2009
comment
Вы правы, это уродливый процесс. Думаю, нужно провести рефакторинг. Спасибо за совет. - person Mark Struzinski; 30.03.2009