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

Создание табличных индексов с использованием Fluent NHibernate

Можно ли генерировать индексы таблиц вместе с остальной частью схемы базы данных с помощью Fluent NHibernate? Я хотел бы иметь возможность генерировать полную базу данных DDL через автоматизированный процесс сборки.

4b9b3361

Ответ 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] работает так же.