Подтвердить что ты не робот

Свободное свойство nhibernate auto increment non key (Id)

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

4b9b3361

Ответ 1

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

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

    < свойство name= "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" />

Ответ 2

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

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 - для получения его на вставках.

Важно отметить, что отображение является только половиной ответа, и оно будет не работать, если столбец не создан как идентификатор. 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. Пользовательский тип, вероятно, изменится или может быть недоступен в других базах данных.