Jestem nowy w NHibernate i C#, więc proszę bądź łagodny!Minimalny i poprawny sposób na mapowanie jeden-do-wielu z NHibernate
Mam następujące dwa NHibernate podmioty:
Employee
{
private long _id;
private String _name;
private String _empNumber;
private IList<Address> _addresses;
//Properties...
}
i
Address
{
private long _id;
private String _addrLine1;
private String _addrLine2;
private String _city;
private String _country;
private String _postalCode;
//Properties
}
i mają one-to-many
relację z Employee
do Address
(każdy pracownika może mieć wiele adresów w swoim rekordzie). Dogodnie ignorując fakt, że więcej niż jeden pracownik może mieszkać pod tym samym adresem.
Rozumiem to z perspektywy obiektów w pamięci (encje NHibernate ). Z czym walczę to pliki odwzorowujące (i zabieram tutaj prosty przykład: ). To, co mam wymyślić do tej pory:
// Intentionally left out XML and <hibernate-mapping>
// Mappings for class 'Employee'. -->
<class name="Employee" table="Employees">
<id name="ID">
<generator class="native">
</id>
<property name="Name" />
<property name="EmpNumber" />
<bag name="Addresses">
<key column="AddressId" />
<one-to-many class="Address" />
</bag>
</class>
i
// Intentionally left out XML and <hibernate-mapping> .
// Mappings for class 'Address'
<class name="Address" table="Addresses">
<id name="ID">
<generator class="native">
</id>
// Intentionally left out name="Employee"
// as I don't have corresponding field in Address entity.
<many-to-one class="Employee" column="EmployeeID" cascade="all" />
<property name="AddrLine1" />
<property name="AddrLine2" />
<property name="City" />
<property name="Country" />
<property name="PostalCode" />
</class>
- Czy jest to prawidłowe?
- Jeśli nie, wydaje mi się, że brakuje tutaj pola w jednostce
Address
, które jest odniesieniem do odpowiedniej jednostkiEmployee
. Ale jeśli tak, to nie mogę zrozumieć, dlaczego jest to konieczne: Nie trzeba sprowadzićAddress
zEmployee
, okrągły tylko w drugą stronę ...
Wydaje mi się, że potrzebujesz tutaj wielu do wielu relacji, a nie jednego do wielu, jeśli adresy są unikalne w tabeli adresów. Oznaczałoby to wiele do wielu tabel, które przechowują identyfikator pracownika i identyfikator adresu. W ten sposób pracownik może być powiązany z jednym lub kilkoma adresami, a adres może należeć do więcej niż 1 pracownika. –
@ColeW Nie chcę, aby adresy należały do więcej niż jednego pracownika. To jest celowe. – markvgti
Jeśli to prawda, musisz dodać identyfikator pracownika w tabeli adresowej, aby określić, które adresy należą do których pracowników. W tabeli adresów może istnieć wiele adresów o tym samym identyfikatorze pracownika. W ten sposób nhibernate będzie wiedział, jak wypełnić 'private IList
_addresses;' w obiekcie 'Employee'. Sugerowałbym również, abyś miał obiekt 'Employee' jako część obiektu' Address', ponieważ nawigacja po obu stronach relacji często jest przydatna, nawet jeśli niekoniecznie ma sens z perspektywy logiki biznesowej przez cały czas. –