2009-03-03 26 views

Odpowiedz

44

W nowszych wersjach Fluent NHibernate, można wywołać metodę Index() zrobić to zamiast używać SetAttribute (który już nie istnieje):

Map(x => x.Prop1).Index("idx__Prop1"); 
+0

Poprawnie, interfejs API został zmieniony i teraz jest to uważany za prawidłowy sposób ustawiania indeksów. Zaktualizowałem odpowiedź na to pytanie, aby odzwierciedlić tę zmianę. Dziękuję Ci. –

15

Masz na myśli indeksy w kolumnach?

Możesz to zrobić ręcznie w swoich plikach ClassMap<...>, dodając .SetAttribute("index", "nameOfMyIndex"), np. tak:

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

lub można to zrobić za pomocą atrybutów automappera - np. tak:

Po utworzeniu modelu trwałości:

{ 
    var model = new AutoPersistenceModel 
    { 
     (...) 
    } 

    model.Conventions.ForAttribute<IndexedAttribute>(ApplyIndex); 
} 


void ApplyIndex(IndexedAttribute attr, IProperty info) 
{ 
    info.SetAttribute("index", "idx__" + info.Property.Name"); 
} 

a następnie to zrobić do podmiotów:

[Indexed] 
public virtual string FirstName { get; set; } 

Lubię ten ostatni. Jest to dobry kompromis między brakiem wpływu na twój model domeny, ale wciąż jest bardzo skuteczny i jasny, co się dzieje.

+0

To dokładnie to, czego szukałem. Dziękuję Ci. –

10

Odpowiedź Mookida jest świetna i bardzo mi pomogła, ale w międzyczasie zmieniło się ciągle zmieniające się Fluent NHibernate API.

więc właściwy sposób pisać mookid próbkę teraz jest następujący:

//... 
model.ConventionDiscovery.Setup(s => 
      { 
       s.Add<IndexedPropertyConvention>(); 
       //other conventions to add... 
      }); 

gdzie IndexedPropertyConvention jest następująca:

public class IndexedPropertyConvention : AttributePropertyConvention<IndexedAttribute> 
{ 
    protected override void Apply(IndexedAttribute attribute, IProperty target) 
    { 
     target.SetAttribute("index", "idx__" + target.Property.Name); 
    } 
} 

Sieć [indeksowane] atrybut działa tak samo teraz.

Powiązane problemy