我正在使用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();
}
我很困惑为什么这不是懒惰加载但是查询所有子对象的数据库?
答案 0 :(得分:1)
不确定我是否明白你的真正目标。以上代码段中的组件内容是否完整?或者只是缩短版本?
无论如何,如此处所述:5.1.13. component, dynamic-component (引用)
<component>
元素将子对象的属性映射到父类的表的列....
因此,背后的想法主要是将其用作C#透视图中的参考对象,同时将其存储在一个表中。示例7.1. Dependent objects
<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; }
...
所以,如果在你的情况下,儿童<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" />
...
和C#:
public class Parent
{
public virtual IList<Child> Children { get; set; }
...
public class Child
{
public virtual Parent Parent { get; set; }
...
所有加载 肯定 将是懒惰的。
答案 1 :(得分:0)
您正在尝试加载组件集合。我不认为有可能懒洋洋地加载它们。尝试将您的组件转换为第一类权利。