Как загрузить список объектов в сущность с помощью Nhibernate Lazy Loading

#c# #nhibernate #lazy-evaluation #lazy-loading

#c# #nhibernate #отложенная оценка #отложенная загрузка

Вопрос:

У меня есть проект с помощью реализации NHibernate и с использованием отложенной загрузки. В этом проекте у меня есть два класса: Person и Family. Связь между этими двумя — это агрегация, это означает, что у человека есть список людей. Отображение — это :

   <class name="Person" table="Person_Person" >

    <id name="Id" type="Int64" unsaved-value="0">
      <generator class="native" />
    </id>

    <bag name="Families" inverse="true" table="Person_Family" cascade="delete" >
      <key column="Person_id_fk"/>
      <one-to-many class="Domain.Entities.Family,RCISP.Domain.Entities"/>
    </bag>

  </class>
 

В этом проекте я получаю человека по идентификатору, затем добавляю семейство в поле families лично и сохраняю Person.

 Person person = SessionInstance.Get<Person>(id);
Family family = new Family();
family.Name = "Ehsan";
person.Families.Add(family);
SessionInstance.Save(person);
 

Пользователь сохраняется в базе данных, но семейство не применяется, потому что активна отложенная загрузка. Но если перед добавлением семейства выполнить подсчет семейств, моя проблема решена.

 int i = person.Families.Count; //Provisional For call in lazy loading
person.Families.Add(family);
SessionInstance.Save(person);
 

Как я могу добавить семейство в person без прямой загрузки семейств person?

Ответ №1:

Вам нужно будет изменить свой каскадный стиль в вашей Families коллекции на all-delete-orphan или all

 <bag name="Families" inverse="true" table="Person_Family" cascade="all-delete-orphan" >
      <key column="Person_id_fk"/>
      <one-to-many class="Domain.Entities.Family,RCISP.Domain.Entities"/>
</bag>
 

Комментарии:

1. Я протестировал это. Путем изменения эта проблема решена, но возникла другая проблема. благодаря этому изменению я не могу удалить семейство. во время удаления семейства Person является исключением из этого сообщения : deleted object would be re-saved by cascade (remove deleted object from associations)

2. это изменение не мешает ленивому подходу?

3. Я не уверен, что это значит? Это не влияет на отложенную загрузку.