Можно ли генерировать индексы таблиц вместе с остальной частью схемы базы данных с помощью Fluent NHibernate? Я хотел бы иметь возможность генерировать полную базу данных DDL через автоматизированный процесс сборки.
Создание табличных индексов с использованием Fluent NHibernate
Ответ 1
В более поздних версиях Fluent NHibernate вы можете вызвать метод Index()
для этого, а не использовать SetAttribute
(который больше не существует):
Map(x => x.Prop1).Index("idx__Prop1");
Ответ 2
Вы имеете в виду индексы в столбцах?
Вы можете сделать это вручную в своих файлах ClassMap<...>
, добавив .SetAttribute("index", "nameOfMyIndex")
, например. так:
Map(c => c.FirstName).SetAttribute("index", "idx__firstname");
или вы можете сделать это, используя атрибутные функции automapper - например, так:
После создания вашей модели сохранения:
{
var model = new AutoPersistenceModel
{
(...)
}
model.Conventions.ForAttribute<IndexedAttribute>(ApplyIndex);
}
void ApplyIndex(IndexedAttribute attr, IProperty info)
{
info.SetAttribute("index", "idx__" + info.Property.Name");
}
а затем сделайте это для своих объектов:
[Indexed]
public virtual string FirstName { get; set; }
Мне нравится последнее. Является хорошим компромиссом между тем, чтобы не быть неинструсивным для вашей модели домена, но все же очень эффективен и ясен в отношении того, что происходит.
Ответ 3
Мукидный ответ велик и мне очень помог, но между тем изменился постоянно меняющийся Fluent NHibernate API.
Итак, правильный способ написать образец mookid теперь следующий:
//...
model.ConventionDiscovery.Setup(s =>
{
s.Add<IndexedPropertyConvention>();
//other conventions to add...
});
где IndexedPropertyConvention:
public class IndexedPropertyConvention : AttributePropertyConvention<IndexedAttribute>
{
protected override void Apply(IndexedAttribute attribute, IProperty target)
{
target.SetAttribute("index", "idx__" + target.Property.Name);
}
}
Атрибут [Indexed] работает так же.