2013-04-21 89 views
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; } 
} 

以下是映射器...

<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)返回假并且集合保持不变。

我想这是因为代理类(DocumentPageProxy)。 一些额外的检查表明:

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

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

回答

1

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

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

谢谢,覆盖等于解决了这个问题。 – Oleg 2013-04-24 07:42:22