Свободное свойство без ключа (Id) автоматического приращения nhibernate - PullRequest
13 голосов
/ 20 июля 2009

Возможно ли иметь целочисленное свойство автоматического приращения класса, управляемое базой данных, но не быть первичным ключом (или идентификатором, как их называет NHibernate)? У меня проблемы с поиском примеров, как это сделать. Любая помощь будет оценена. Спасибо.

Ответы [ 2 ]

9 голосов
/ 20 июля 2009

Два варианта.

  • если база данных на 100% ответственна за это, вам просто нужно сообщить NHibernate, что свойство генерируется, а не включать его в какие-либо обновления / обновления. Недостатком является то, что NH потребуется сделать дополнительный выбор, чтобы сохранить значение в памяти свежим.

    <имя свойства = "Foo" сгенерировано = "всегда" update = "false" insert = "false" />

  • если база данных не отвечает, и вы просто хотите сделать это автоматически, вы можете использовать перехватчик, чтобы установить значение 1 на вставке и увеличить его на 1 при обновлении.

http://www.nhforge.org/doc/nh/en/index.html#objectstate-interceptors (11,1 - перехватчики)

Вы должны переопределить OnSave (), чтобы найти свойство и установить начальное значение, а затем переопределить OnFlushDirty (), чтобы найти свойство свойства и приращение.


Edit:

Я идиот, не заметил, что ты сказал Fluent NHibernate.


Редактировать # 2:

Думаю, вам также может быть интересно использовать этот столбец в качестве версии?

< version name="Foo" generated="always" />
5 голосов
/ 13 февраля 2012

Это работает для меня:

public class Potato
{
    public virtual Guid Id { get; protected set; }
    public virtual int LegacyId { get; protected set; }
}

public class PotatoMap : ClassMap<Potato>
{
    public PotatoMap()
    {
        Id(x => x.Id).GeneratedBy.GuidComb();
        Map(x => x.LegacyId).CustomSqlType("INT IDENTITY(1,1)").Not.Nullable().ReadOnly().Generated.Insert();
    }
}

По сути, целое число настроено для создания базы данных, и NHibernate получает указание извлечь его по вставкам.

Важно отметить, что сопоставление составляет только половину ответа, и оно будет не работать, если столбец не создан как IDENTITY. CustomSqlType добавлен в отображение с целью создания правильного sql при генерации таблиц с SchemaExport. Это сгенерированный sql:

 create table [Potato] (
         Id UNIQUEIDENTIFIER not null,
        LegacyId INT IDENTITY(1,1) not null,
        primary key (Id)
     )

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

Обратите внимание, что я проверял это только с Sql Server. Пользовательский тип, вероятно, изменится или может быть недоступен в других базах данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...