C# 非惰性加载

C# 非惰性加载,c#,nhibernate,nhibernate-mapping,C#,Nhibernate,Nhibernate Mapping,我使用的是NHibernate 3.3.3.4001。我遇到了一个问题,在发出Get请求时,NHibernate没有延迟加载数据。相反,它填充整个对象模型,导致性能非常慢。.hbm文件如下所示: <?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="My.Assembly" namesp

我使用的是NHibernate 3.3.3.4001。我遇到了一个问题,在发出Get请求时,NHibernate没有延迟加载数据。相反,它填充整个对象模型,导致性能非常慢。.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>
using (var transaction = Session.BeginTransaction())
{
    t = Session.Get<T>(id);
    transaction.Commit();
}

我不明白为什么这不是延迟加载,而是查询数据库中的所有子对象?

您正在尝试加载组件集合。我认为不可能懒散地加载它们。尝试将您的组件转换为一级实体。

不确定我是否理解您的真正目标。上面代码段中的组件内容是否完整?或者它只是一个缩短版本

无论如何,正如这里所说的:(引用)

元素将子对象的属性映射到父类的表的列

因此,背后的想法主要是将其作为C#透视图中的参考对象使用,同时将其存储在一个表中。榜样

因此,如果在您的案例中,子项
实际上只是一个集合-请不要使用上述映射,而是类似以下内容:

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

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

<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>


谢谢,这让我走上了正轨。主要问题是将
嵌套在
中,很高兴看到这一点。享受NHibernate,伟大的工具;)
<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; }
    ...