2009-05-12 13 views
5

Mam stół o nazwie "Orderrow". Zamówienie ma złożony klucz podstawowy (CPK) z następującymi kolumnami: Identyfikator zamówienia, Numer produktu, Numer wierszaNHibernate wiele podstawowych kluczy mapujących

Identyfikator zamówienia i identyfikator produktu to także klucze obce odnoszące się do tabel Zamówienia i produkty. Numer RowNumber jest generowany w aplikacji.

Zastanawiam się, jak to jest mapowane w NHibernate, ponieważ mogę ustawić tylko 1 element id i 1 podelement generatora.

Odpowiedz

6

Istnieje własność 'composite-id', której można używać w mapowaniu klas zamiast właściwości 'id'. Powinieneś jednak wiedzieć, że zespół nHibernate zdecydowanie odradza korzystanie z niego. Wygląda na to, że masz do czynienia ze starszą bazą danych, w której nie masz kontroli nad schematem. Tak więc "identyfikator złożony" jest specjalnie dla twojej sytuacji.

Sprawdź docs NH o więcej informacji: http://nhibernate.info/doc/nh/en/index.html

+0

czytałem, że zbyt w NHibernate API ref. Ale nie mam "starej" bazy danych, tylko bazy danych do celów badawczych, więc mogę łatwo zmienić tutaj tabelę zamówień. Więc jaka jest preferowana lepsza opcja w projektowaniu stołu? Czy powinienem utworzyć 1 klucz główny w tabeli "Zamówienie", który jest unikalny w każdym wierszu? –

+0

Tak. Preferowana jest pojedyncza unikalna kolumna dla podstawowej. – NathanD

0

Osobiście nie lubię mieć złożone klucze podstawowe w moich schematów tabel bazy danych, plus zazwyczaj są „twarde”, aby obsługiwać dowolną ORM odwzorowującym próbowałem. Jeśli muszę podać unikalną tożsamość do wiersza w tabeli (szczególnie jeśli reprezentuje obiekt biznesowy), wolę użyć pojedynczej wartości surogatu Id - GUID lub Integer - jeśli którekolwiek z pól w tabeli nie jest jest odpowiedni. Używanie identyfikatora złożonego jest zawsze kłopotliwe podczas pisania zapytań i dołączeń zapytań, więc zwykle stosuję zastępczy identyfikator (który nie ma znaczenia dla obiektu biznesowego, ale identyfikuje sam obiekt) i umieszczam unikalne ograniczenie na polach poprzedni CPK.

9

Oto przykład za pomocą właściwości kompozytowych id w pliku mapowania NHibernate:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Domain" namespace="Domain.Model"> 

    <class name="Program" table="program"> 
    <composite-id> 
     <key-property name="Id" column="id"></key-property> 
     <key-property name="Prog" column="prog"></key-property> 
     <key-property name="Site" column="site"></key-property> 
    </composite-id> 
    <property name="ActiveDate" column="active_date"/> 
    <property name="Year" column="year"/> 
    </class> 

</hibernate-mapping> 
Powiązane problemy