2013-04-21 96 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