jak zrobić this mapping, ale płynnie?Jak dołączyć do tabeli w płynnym nhibernate
Wiem, że mogę używać "Referencji", ale nie potrzebuję wszystkich kolumn z powiązanej tabeli. Potrzebuję tylko jednej nieruchomości.
jak zrobić this mapping, ale płynnie?Jak dołączyć do tabeli w płynnym nhibernate
Wiem, że mogę używać "Referencji", ale nie potrzebuję wszystkich kolumn z powiązanej tabeli. Potrzebuję tylko jednej nieruchomości.
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:
dodałem właściwość o nazwie displayorder do mojego FormStructure
obiektu.
public virtual int? DisplayOrder { get; set; }
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
.
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
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
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