【问题标题】:How load a list of object in a Entity by Nhibernate Lazy Loading如何通过 Nhibernate 延迟加载加载实体中的对象列表
【发布时间】:2011-10-29 07:00:29
【问题描述】:

我有一个 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>

在这个项目中,我通过 ID 获取一个人,然后将一个家庭添加到 Person 中的家庭字段并保存 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);

如何在不直接加载人员家庭的情况下向人员添加家庭?

【问题讨论】:

    标签: c# nhibernate lazy-evaluation lazy-loading


    【解决方案1】:

    您需要将Families 集合上的层叠样式更改为all-delete-orphanall

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

    【讨论】:

    • 我测试过了。通过更改,这个问题得到了解决,但是还有另一个问题。通过此更改,我无法删除家庭。在删除人的家庭期间,这条消息是一个例外:deleted object would be re-saved by cascade (remove deleted object from associations)
    • 这个变化不会干扰惰性方法吗?
    • 我不确定这意味着什么?这不会影响延迟加载。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 2011-07-16
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多