Возможно ли иметь целочисленное свойство автоматического приращения класса, управляемого базой данных, но не быть первичным ключом (или Id, поскольку NHibernate ссылается на них)? У меня возникли проблемы с поиском примеров того, как это сделать. Любая помощь будет оценена по достоинству. Спасибо.
Свободное свойство nhibernate auto increment non key (Id)
Ответ 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. Пользовательский тип, вероятно, изменится или может быть недоступен в других базах данных.