2016-08-01 113 views
2

我有兩個對象。其中一位父母引用了Locale。此語言環境來自語言環境列表。當該語言環境被刪除時,我希望它從所有引用類型中清除對自身的任何引用(將相關值設置爲空)。C#NHibernate - 刪除所有對刪除對象的引用

現在,我有一個系統遍歷NHibernate映射的所有實體,並通過使用它們的類元數據確定哪些類型引用區域設置類型。然後,我爲該引用類型構建一個查詢(使用ICriteria),其中Locale類型的屬性等於我嘗試刪除的區域設置的Id。任何返回的對象,我將該屬性設置爲null,然後更新它們。

問題:有沒有更好的方法 - 希望使用內置NHibernate的東西 - 指示一個對象刪除所有對自身的引用?

對象:

public class Parent 
{ 
    public virtual Guid Id { get; set; } 
    public virtual Locale Loc { get; set; } 
} 

public class Locale 
{ 
    public virtual Guid Id { get; set; } 
} 

映射:

public class ParentMapping : ClassMap<Parent> 
{ 
    Id(x => x.Id).GeneratedBy.Guid(); 

    References(x => x.Loc).Nullable(); 
} 

public class LocaleMapping : ClassMap<Locale> 
{ 
    Id(x => x.Id).GeneratedBy.Guid(); 
} 
+0

我認爲你映射是錯誤的。兩者都映射到。此關係中的小p父母是Locale。在映射中,引用是多對一的映射,其中語言環境是一個映射。你有沒有想過如何使映射雙向回到Locale?設置關係的級聯。 – Fran

+0

我很抱歉。我知道我會在某個地方犯一個錯字。我糾正了它。它應該是'LocaleMapping:ClassMap '。當你說雙向時,你的意思是地區實體瞭解所有擁有它的父母,對嗎? –

+0

因爲我知道所有擁有它的父母的地方實體,我避而遠之的原因是它很難僅加載沒有所有其他信息的Locale。我希望區域設置儘可能乾淨。 –

回答

1

按照要求,這裏是我如何清盤處理這一問題。我實際上使用了@Fran最初提出的建議來提出解決方案。

該解決方案是非常特定於我的類型的應用程序和使用若干一起工作以實現期望的我的結果的應用程序的部分的涉及。具體來說,我的應用程序是一個RESTful Web服務,由WCF,JSON.NET和NHibernate提供支持。

首先,我加入了現場所有家長參考,使用的hasMany映射,從而使語言環境知道所有引用它的父母:

public virtual IList<Parent> Parents { get; set; } 

HasMany(x => x.Parents); 

在這裏指出我在整個應用程序中使用延遲加載也很重要。

雖然這讓我很容易通過使用適當的級聯行爲來刪除語言環境,但這在加載/ GET場景中造成了一個問題,那就是當我將語言環境傳遞到JSON.NET中時(在向客戶端的門),JSON.NET將走親愛集合,並序列化整個事情。很明顯,這是不受歡迎的,因爲我們比客戶要求的要多得多。這是我在OP的評論中提到的問題。

作爲@Fran提到,我可以使用投影;然而,我的所有參考列表都是通過一個公共端點訪問的,以便提取它們的CRUD操作並減少重複代碼的數量:我的所有參考列表都實現了一個名爲ReferenceListBase的抽象類。無論如何,我想要一個解決方案,其中實現類本身能夠決定它應該發送到客戶端的多少(序列化)。

我的解決方案是在Parents集合上添加一個[JsonIgnore]屬性,這與延遲加載相結合意味着JSON.NET從不查看屬性,因此關係永遠不會被加載。

該解決方案總是有點像黑客,但它已經實現了我想要的所有結果,並且使添加新參考列表非常容易。我希望這可以幫助你;如果沒有,發佈一個新問題,在這裏鏈接,我會盡力幫助你。 :)