0

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

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

以下是映射器……</p>

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

我不知道这里出了什么问题以及我应该如何删除/删除子对象。

4

1 回答 1

1

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

var pageToRemove = document.Pages.Single(p => p.ID == page.Id);
document.Pages.Remove(pageToRemove);
于 2013-04-22T19:27:06.947 回答