Генерация табличных индексов с использованием Fluent NHibernate - PullRequest
25 голосов
/ 03 марта 2009

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

Ответы [ 3 ]

48 голосов
/ 19 ноября 2009

В более поздних версиях Fluent NHibernate вы можете вызвать метод Index(), чтобы сделать это, вместо использования SetAttribute (которого больше не существует):

Map(x => x.Prop1).Index("idx__Prop1");
15 голосов
/ 03 марта 2009

Вы имеете в виду индексы по столбцам?

Вы можете сделать это вручную в ваших ClassMap<...> файлах, добавив .SetAttribute("index", "nameOfMyIndex"), например, вот так:

Map(c => c.FirstName).SetAttribute("index", "idx__firstname");

или вы можете сделать это с помощью атрибутов автомата - например, вот так:

После создания вашей модели персистентности:

{
    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; }

Мне нравится последний. Является хорошим компромиссом между тем, чтобы не быть навязчивым к вашей модели предметной области, но при этом быть очень эффективным и четко понимать, что происходит.

10 голосов
/ 26 мая 2009

Ответ Mookid великолепен и мне очень помог, но между тем постоянно меняющийся API Fluent NHibernate изменился.

Итак, правильный способ написания примера 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] теперь работает так же.

...