Генерируйте индексы таблицы с помощью Быстрого NHibernate

(0, _b.a)() гарантирует, что функция _b.a вызывается с this, установленным для глобального объекта (или если строгий режим включен, undefined). Если вы должны были называть _b.a() напрямую, то _b.a вызывается с this, установленным на _b.

(0, _b.a)(); эквивалентно

0; // Ignore result
var tmp = _b.a;
tmp();

( , является оператором запятой, см. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator ).

25
задан Todd Brooks 3 March 2009 в 20:08
поделиться

3 ответа

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

Map(x => x.Prop1).Index("idx__Prop1");
48
ответ дан 28 November 2019 в 18:04
поделиться

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

можно сделать это вручную в Вашем 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; }

мне нравится последний. Хороший компромисс между тем, чтобы не быть non-instrusive к Вашей модели предметной области, и все же будучи очень эффективным и ясным на том, что происходит.

15
ответ дан mookid8000 15 October 2019 в 15:12
поделиться

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

10
ответ дан 28 November 2019 в 18:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: