Возможно ли иметь целочисленное свойство автоматического приращения класса, управляемого базой данных, но не быть первичным ключом (или Id как NHibernate относится к ним)? У меня возникли проблемы с поиском примеров того, как это сделать. Любая помощь будет оценена по достоинству. Благодарю.Свободное свойство nhibernate auto increment non key (Id)
ответ
Два варианта.
, если база данных 100% ответственность за это вам просто нужно сказать NHibernate, что свойство генерируется и не включать его в каком-либо обновления/isnerts. Недостатком является то, что NH необходимо будет сделать дополнительный выбор, чтобы сохранить значение свежее в памяти.
< имя свойства = «Foo» создается = «всегда» обновление = «ложь» вставка = «ложь» />
, если база данных не несет ответственности, и вы просто хотите, чтобы это делалось автоматически вы можете используйте перехватчик, чтобы установить значение 1 в вставке и увеличить его на 1 при обновлении.
http://www.nhforge.org/doc/nh/en/index.html#objectstate-interceptors (11,1 - перехватчики)
Вы бы переопределить OnSave(), чтобы найти недвижимость и задать начальное значение и затем переопределить OnFlushDirty(), чтобы найти свойство собственности и приращения.
Edit:
Я идиот, не заметил, что ты сказал Fluent NHibernate.
Edit # 2:
Я думаю, вы могли бы быть заинтересованы в использовании этого столбца как управление версиями?
< version name="Foo" generated="always" />
Это работает для меня:
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. Пользовательский тип, вероятно, изменится или может быть недоступен в других базах данных.
- 1. Hibernate Auto-Increment Non-ID column
- 2. JPA Auto Increment Свойство, но не ID
- 3. Auto increment property not key
- 4. Auto Increment Primary Key Integrity
- 5. Auto increment id JSON
- 6. Auto increment ID C#
- 7. Auto Increment ID пациента
- 8. Auto increment id
- 9. Hibernate Auto Increment ID
- 10. MongoDB auto increment ID
- 11. JsGrid - Auto Increment ID
- 12. Auto Increment id 0
- 13. C# Class Auto increment ID
- 14. MS SQL Auto Increment non Identity Column
- 15. auto increment id в GetElementsById
- 16. auto increment id не вставлен
- 17. MySQL ID Column Auto Increment
- 18. Auto Increment id в sharepoint
- 19. Auto increment ID со строкой
- 20. Получить auto increment id mysql
- 21. WP Post ID Auto Increment
- 22. Yii - получить auto increment id
- 23. Auto increment Id in .net
- 24. Non-auto-increment rails/postgresql column
- 25. mysql primary key auto increment issue
- 26. phpmyadmin auto increment primary key act strange
- 27. Auto Increment в FLuent Nhibernate и PostgreSQL
- 28. ID не может быть null (Auto Increment)
- 29. странная проблема с MySQL Auto Increment Id
- 30. Fluent Nhibernate HasMany on non primary key
Не беспокойтесь, это почти то же самое. Карта (x => x.Foo) .ReadOnly().SetAttribute («сгенерировано», «всегда»); SetAttribute будет заменен на Generated.Always, когда мы нажмем 1.0. –
Я загрузил последний FNH и был немного смущен .Update() не принимает параметр. Я не был уверен, что это закончится, как в картографии. ReadOnly() имеет смысл. – anonymous