NHibernate один-ко-многим - PullRequest
       2

NHibernate один-ко-многим

2 голосов
/ 27 апреля 2010

Я хочу отобразить один на много объектов Персона and PersonAddress

public class Person{
public virtual int Id {get; set;} public virtual string FirstName {get; set;}
public virtual ICollection<PersonAddress> PersonAddress { get; set; }}

public class PersonAddress{
public virtual int Id {get; set;}
public virtual int PersonId {get; set;}
...     }

Я не хочу иметь свойство объекта person в адресе. Он создает циклические ссылки и не требуется для моего приложения.

файл сопоставления выглядит следующим образом:

<class name="Person"  table="Persons" >
    <id name="Id" type="Int32" column="PersonId">
        <generator class="identity"/>
    </id>
    <set name="PersonAddress" table="PersonAddress" lazy="true" fetch="join" outer-join="true" cascade="all-delete-orphan">
        <key column="PersonId"></key>
        <one-to-many class="PersonAddress"/>
    </set>  
</class>

<class name="PersonAddress"  table="PersonAddress" >
    <id name="Id" type="Int32" column="Id">
        <generator class="identity"/>
    </id>
    <property name="PersonId" column="PersonId" type="Int32"/>
    <property name="PhoneWork" column="PhoneWork" type="String"/>       
</class>

при попытке вставить человека с личным адресом я получаю исключение. Потому что он пытается вставить PersonAddress с неверным идентификатором (по умолчанию -1, 0 и т. Д.).

в образцах, которые я обнаружил, указана обратная ссылка от ребенка к родителю

Ответы [ 2 ]

1 голос
/ 27 апреля 2010

Попробуйте это:

public class Person {
    public virtual int Id { get; set; }
    public virtual string FirstName { get; set; }
    public virtual IList<PersonAddress> PersonAddress { get; set; }
    ... }

public class PersonAddress {
    public virtual int Id { get; set; }
    public virtual Person Person { get; set; }
    ... }

У вас должна быть ссылка на Person, а не просто PersonId. А если у вас возникли проблемы с файлами сопоставления .hbm.xml, рассмотрите возможность использования Fluent NHibernate . Его функция автоматического картирования работает как шарм.

На NHibernate также есть видео серия , которая довольно хорошо освещает эту тему.

0 голосов
/ 27 апреля 2010

Только что ответили здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...