Я новичок в NHibernate и C#, поэтому, пожалуйста, будьте нежны!Минимальный и правильный способ сопоставления «один ко многим» с NHibernate
У меня есть следующие два NHibernate лица:
Employee
{
private long _id;
private String _name;
private String _empNumber;
private IList<Address> _addresses;
//Properties...
}
и
Address
{
private long _id;
private String _addrLine1;
private String _addrLine2;
private String _city;
private String _country;
private String _postalCode;
//Properties
}
и они имеют one-to-many
отношения с Employee
к Address
(каждый сотрудник может иметь несколько адресов в их записи). Удобно игнорировать тот факт, что более одного сотрудника могут проживать по тому же адресу.
Я понимаю это с точки зрения объектов в памяти (объекты NHibernate ). То, с чем я борюсь, это файлы сопоставления (и я принимаю здесь ). Это то, что я придумал до сих пор:
// 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>
и
// 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>
- Правильно ли это?
- Если нет, мне кажется, что здесь отсутствует поле в объекте
Address
, который является ссылкой на соответствующий объектEmployee
. Но если так, то я не могу понять, почему это необходимо: Мне не нужно, чтобы принести вAddress
изEmployee
, только наоборот ...
Мне кажется, что вам нужно много-много отношений здесь, а не один ко многим, если адреса уникальны в адресной таблице. Это означало бы много-много таблиц, в которых хранится идентификатор сотрудника и идентификатор адреса. Таким образом, сотрудник может быть связан с одним или несколькими адресами, и адрес может принадлежать более чем одному сотруднику. –
@ColeW Я не хочу, чтобы адреса принадлежали нескольким сотрудникам. Это преднамеренно. – markvgti
Если это так, вам нужно будет добавить идентификатор сотрудника в таблицу адресов, чтобы определить, какие адреса принадлежат тем сотрудникам. Таким образом, в таблице адресов могут присутствовать несколько адресов с одинаковым идентификатором сотрудника. Вот как nhibernate будет знать, как заполнить 'private IList
_addresses;' в объекте 'Employee'. Я также предлагаю, чтобы у вас был объект «Сотрудник» как часть объекта «Адрес», так как навигацию по обеим сторонам отношения часто пригодится, даже если это не обязательно имеет смысл с точки зрения бизнес-логики все время. –