NHibernate не ленивая загрузка

1

Я использую NHibernate 3.3.3.4001. У меня возникла проблема, когда NHibernate не лень загружать данные при выдаче запроса Get. Вместо этого он заполняет всю объектную модель, что приводит к очень низкой производительности. Файл.hbm выглядит следующим образом:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
                   assembly="My.Assembly" namespace="Assembly.Model">

  <class name="Parent" table="tblParent">
    <id name="ID">
        <generator class="native"></generator>
    </id>
    <version name="Version" column="Version"/>    
    <component name="Children">
      <bag name="Collection" table="tblChildren" 
                             cascade="save-update, merge" inverse="true">
        <key column="ParentID"></key>
        <one-to-many class="Children"></one-to-many>
      </bag>
    </component>
    <property name="DateCreated" column="DateCreated" update="false" insert="false" />
    <property name="Inactive" column="Inactive" />
  </class>

</hibernate-mapping>

Я ожидал, что NHibernate будет лениво загружать все дочерние объекты и не отправлять запросы в базу данных. Я попытался добавить явное lazy = true и default-lazy=true но это не имело никакого значения. Я проверил объект Config и вижу, что сопоставления имеют islazy=true.

Я вызываю Get следующим образом:

using (var transaction = Session.BeginTransaction())
{
    t = Session.Get<T>(id);
    transaction.Commit();
}

Я озадачен тем, почему это не загружается лениво, но запрашивает базу данных для всех дочерних объектов?

Теги:
nhibernate
nhibernate-mapping

2 ответа

1
Лучший ответ

Не уверен, понимаю ли я вашу настоящую цель. Является ли содержание компонента в фрагменте выше завершенным? или это просто сокращенная версия?

В любом случае, как указано здесь: 5.1.13. компонент, динамический компонент (цитируют)

Элемент <component> отображает свойства дочернего объекта в столбцы таблицы родительского класса....

Таким образом, идея заключается главным образом в том, чтобы использовать ее как ссылочный объект с точки зрения С#, а храниться в одной таблице. Пример 7.1. Зависимые объекты

<class name="Eg.Person, Eg" table="person">
    <id name="Key" column="pid" type="string">
        <generator class="uuid.hex"/>
    </id>
    <property name="Birthday" type="date"/>
    <component name="Name" class="Eg.Name, Eg">
        <parent name="NamedPerson"/> <!-- reference back to the Person -->
        <property name="Initial"/>
        <property name="First"/>
        <property name="Last"/>
    </component>
</class>

Поскольку объекты выглядят так:

public class Person
{
    ...
    public virtual Name Name { get; set; }

public class Name
{
    public virtual Person NamedPerson { get; set; }
    public virtual string Initial { get; set; }    
    ...

Итак, если в вашем случае Children <component> на самом деле представляет собой только коллекцию - не используйте приведенное выше сопоставление, но что-то вроде этого:

родитель:

<class name="Parent" table="tblParent">
  <id name="ID" generator="native" />
  <version name="Version" column="Version"/>    

  <!-- just a bag -->
  <bag name="Children" table="tblChildren" cascade="save-update, merge" inverse="true">
    <key column="ParentID"></key>
    <one-to-many class="Child"></one-to-many>
  </bag>

  <property ...
</class>

Ребенок:

<class name="Child" table="tblChildren">
  ...
  <many-to-one name="Parent" column="ParentID" />
  ...

И С#:

public class Parent
{
    public virtual IList<Child> Children { get; set; }
    ...

public class Child
{
    public virtual Parent Parent { get; set; }
    ...

И вся загрузка наверняка будет ленивой.

  • 0
    Спасибо, это поставило меня на правильный путь. Основной проблемой было размещение <bag> внутри <component>
  • 0
    Хорошо, приятно видеть это. Наслаждайтесь NHibernate, отличным инструментом;)
0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню