2009-08-06 17 views

Odpowiedz

24

To, co powiedział Paco, nie jest właściwe. Można to zrobić w Fluent NHibernate. Przez pewien czas przeszukiwałem sieć, nie mogłem znaleźć nikogo mówiącego o tej opcji, więc po prostu bawiłem się trochę z FNHibernate iw końcu udało mi się to zrobić.

To był mój scenariusz:

Mam dwie tabele -

"FormFields" => Columns { "FieldId", "FieldName", "FieldType", "DisplayOrder" } 
"FormStructure" => Columns { "FormId", "FormType", "FieldId" } 

te były moje podmioty:

public class FormStructure 
{ 
    public virtual Int32 FormId { get; private set; } 
    public virtual Int32 FormType { get; set; } 
    public virtual FormField FieldId { get; set; } 
} 

public class FormField 
{ 
    public virtual int FieldId { get; private set; } 
    public virtual String FieldName { get; set; } 
    public virtual int? FieldType { get; set; } 
    public virtual int? DisplayOrder { get; set; } 
} 

Mam kilka metod w mojej kwerendy, która zwraca listę z obiektów FormStructure. Chciałem, aby te metody dały mi je zamówione przez pole DisplayOrder w obiekcie FormField i chciałem, aby DisplayOrder był dostępny jako właściwość w moim obiekcie FormStructure również z innych powodów.

to w zasadzie oznacza, że ​​muszę połączyć tabele, tak by odzyskać wszystkie kolumny z tabeli FormStructure wraz z kolumną DisplayOrder od stołu FormField, łącząc je na pasującymi FieldId kolumn.

Co zrobiłem, aby rozwiązać ten problem:

  1. dodałem właściwość o nazwie displayorder do mojego FormStructure obiektu.

    public virtual int? DisplayOrder { get; set; } 
    
  2. dodałem metodę Join do mojego FormStructure klasy mapowania tak wyglądało to w ten sposób.

    public class FormStructureMap : ClassMap<FormStructure> 
    { 
        public FormStructureMap() 
        { 
         Table("FormStructure"); 
    
         Id(x => x.Id); 
         Map(x => x.FormType); 
         References(x => x.Schedule).Column("ScheduleId"); 
         References(x => x.Field).Column("FieldId"); 
         Map(x => x.IsMandatory).Nullable(); 
    
         Join("FormFields", m => 
         { 
          m.Fetch.Join(); 
          m.KeyColumn("FieldId"); 
          m.Map(t => t.DisplayOrder).Nullable(); 
         }); 
        } 
    } 
    

Sposób Join będzie oczywiście dołączyć między dwiema tabelami w kolumnie zdefiniowanymi w metodzie KeyColumn obrębie Dołącz.

Spowoduje to również usunięcie niektórych wierszy, które mają wartości puste. Aby tego uniknąć (wpadłem na to ostatnio) możesz dodać m.Optional(); w metodzie Join.

mogę teraz pobrać listę FormStructure obiektów, zamówić je przez DisplayOrder a nawet DisplayOrder dostępne jako właściwość w obiekcie FormStructure.

return session.CreateCriteria<FormStructure>() 
       .Add(Expression.Eq("FieldName", fieldName)) 
       .AddOrder(Order.Asc("DisplayOrder")) 
       .List<FormStructure>(); 

To nie mogło być zrobione wcześniej, ponieważ nie uznały kolumny w klauzuli Order mam tam DisplayOrder.

+0

Interesujące jest jednak, że dokumentacja w metodzie Join() z mapowaniem podklasy mówi o argumencie 2nd Action na Join() -> "działa to tylko w przypadku strategii hierarchii typu tabela-na-spadek. – PandaWood

0

O ile mi wiadomo, nie jest to obsługiwane w Fluent NHibernate, podobnie jak wiele innych mapowań specyficznych dla bazy danych starszego typu. Obawiam się, że musisz przełączyć się z powrotem do hbm.xml lub wymieszać płynne odwzorowania z hbm.xml

+0

Po prostu wpadłem na ten sam dokładny problem. Wszystkie tablice zostały już zmapowane płynnie i muszę dodać tylko jedną kolumnę w łączeniu, jak pokazano w łączu. Jak mogę miksować moje płynne odwzorowania z tym dodatkiem w odwzorowaniach xml? – gillyb

Powiązane problemy