Я использую 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();
}
Я озадачен тем, почему это не загружается лениво, но запрашивает базу данных для всех дочерних объектов?
Не уверен, понимаю ли я вашу настоящую цель. Является ли содержание компонента в фрагменте выше завершенным? или это просто сокращенная версия?
В любом случае, как указано здесь: 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; }
...
И вся загрузка наверняка будет ленивой.
Вы пытаетесь загрузить сборку компонентов. Я не думаю, что их можно лениво загрузить. Попробуйте преобразовать свой компонент в первый класс.
<bag>
внутри<component>