2010-08-09 12 views
7

Próbuję uzyskać pojedynczą właściwość z połączonego stołu, w którym nie-PK w moim głównym stole jest połączone z PK zagranicznego stołu. Poniżej znajduje się uproszczony przykładem tego, co staram się osiągnąć (Nie chcę odwołać podmiotu zagranicznego):Fluent NHibernate join nie używając klucza podstawowego

tabelach:

CREATE TABLE Status 
(
    Id int, 
    Body text, 
    CategoryId int 
) 

CREATE TABLE Category 
(
    Id int, 
    Name text 
) 

SQL do generowania:

SELECT Id, Body, CategoryId, Category.Name AS CategoryName 
FROM Status 
LEFT JOIN Category ON Category.Id = Status.CategoryId 

Próbuję odwzorować łączenie w ten sposób w StatusMap, ale wydaje się być łączenia na dwóch podstawowych kluczy (gdzie Status.Id = Category.Id):

Join("Category" m => 
{ 
    m.Optional(); 
    m.KeyColumn("CategoryId"); 
    m.Map(x => x.CategoryName, "Name"); 
}); 
+0

Nie mogę również dowiedzieć się, jak to zrobić. Jeśli szukasz obejścia, możesz zamiast tego zastąpić widok, co zwykle robię dla tego typu rzeczy. – cbp

+0

To właśnie używam obecnie jako obejście, cieszę się, że nie jestem jedyny :) – jwarzech

Odpowiedz

4

O ile wiem, tylko odwrotnie to przy użyciu Fluent jest mapowanie do widoku jak przegląda robić. Join() będzie zawsze mapował do klucza podstawowego tabeli nadrzędnej. Metoda KeyColumn określa kolumnę klucza tylko dla tabeli podrzędnej, która w Twoim przypadku jest tabelą kategorii.

Aby uzyskać pożądany kod SQL przy użyciu uproszczonej wersji powyżej, prawdopodobnie trzeba użyć numeru References, aby zdefiniować relację wiele do jednego między stanem i kategorią.

Powiązane problemy