无法删除子对象

时间:2013-04-21 13:23:10

标签: nhibernate collections parent-child one-to-many

我遇到了从子集合中删除对象的问题。 我有一个带有子对象集合的父类。

public class Document
{
    public Document()
    {
        Pages = new List<DocumentPage>();
    }

    public virtual Int64 Id { get; set; }
    public virtual IList<DocumentPage> Pages { get; set; }
}
public class DocumentPage
{
public virtual Int64 Id { get; set; }
public virtual Document Document { get; set; }
}

以下是地图制作者......

  <class name="Document">
    <id name="Id">
      <generator class="native"/>
    </id>

    <bag name="Pages" table="DocumentPage" inverse="true" lazy="true" 
         fetch="select"  cascade="all-delete-orphan">
      <key>
        <column name="DocumentId" not-null="true" />
      </key>
      <one-to-many class="DocumentPage" />
    </bag>

  </class>

  <class name="DocumentPage">
    <id name="Id">
      <generator class="native"/>
    </id>
    <many-to-one name="Document" class="Document" fetch="select">
      <column name="DocumentId" not-null="true" />
    </many-to-one>
  </class>

我必须删除子对象。为此,我将其从子对象集合中删除并保存父对象。

问题是我无法从页面集合中删除页面。 document.Pages.Remove(page)返回false ,收藏品保持不变。

我认为这是因为代理类(DocumentPageProxy)而发生的。 一些额外的检查显示:

page.Equals(document.Pages[0]) returns **false** when
Equals(page, document.Pages[0]) returns **true**.
document.Pages.RemoveAt(0) works fine.

我不知道这里有什么问题,我应该如何删除/删除子对象。

1 个答案:

答案 0 :(得分:1)

您需要重写Equals和GetHashCode,以便Remove能够根据其标识符值而不是引用相等性来查找DocumentPage。或者你可以这样做:

var pageToRemove = document.Pages.Single(p => p.ID == page.Id);
document.Pages.Remove(pageToRemove);