2009-12-17 67 views
0

我仍然在這裏學習,並有關於子集合的問題。我有一個叫做Audio的聚合根,它有一個AudioDownloads集合。NHibernate域模型 - 將子對象添加到集合

下載是下載音頻的每個IP地址的記錄,我不想爲每個音頻重複記錄相同的IP。

在我的領域我有以下功能:

public virtual void Add(AudioDownload download) 
    { 
     if (!AudioDownloads.Contains(download)) { 
      TotalDownloads++; 
      AudioDownloads.Add(download); 
     } 
    } 

這就是我如何調用Add功能:

var download = new AudioDownload(); 
audio.Add(download); 

這是返回數據庫中的所有下載此音頻(哪些應該是數千!),即使已經存在,它仍然會添加下載。

我正在使用S#arp和DomainSignature方法來比較我的實體。

這裏是我的域名:

public class AudioDownload : Entity, ITenantSpecific 
{ 
    public AudioDownload() { DateAdded = DateTime.Now; } 

    [DomainSignature] 
    public virtual Audio Audio { get; set; } 

    [DomainSignature] 
    public virtual string Ip { get; set; } 

    public virtual DateTime DateAdded { get; set; } 
} 

我的問題是......就算我能得到AudioDownloads不添加重複的條目,我應該被這種方式在所有做什麼呢?

非常感謝!

保羅

+0

你爲什麼要做一個手冊Contains()檢查元素是否已經包含,而不是使用集合的ISet(這會自動執行此操作)? – 2009-12-17 15:24:38

+0

嗨, 我已經嘗試將其設置爲ISet,但它仍然讓我添加一個重複的條目。 我的實體有3個屬性。 -Id - 音頻 -DateTime 請問日期時間屬性使每個下載唯一,或者如果我不使用該財產的[DomainSignature]過濾器應該坐視不理? Paul – 2009-12-17 15:58:01

+0

我認爲你需要覆蓋AudioDownload類上的equals – dotjoe 2009-12-17 20:45:45

回答

1

我期望大多數的方法可以做到這將始終引領您查詢從數據庫中,這可能不是你想要的所有下載。

另一種可能更便宜的方法是在基於AudioId和Ip定義的數據庫中擁有唯一的密鑰。如果你插入一個重複的記錄,你會從NHibernate得到一個異常,告訴你一個唯一的鍵被違反了:優雅地處理這個異常(即不要將它顯示爲錯誤,加載現有的AudioDownload並將來使用它)和我相信你會實現你的目標。

當你使用這種方法時,不要檢查下載是否已經包含在集合中,因爲這仍然會觸發加載所有記錄。

另一方面:看到某些內容是多次從相同的Ip下載的,會不會很有趣?

+0

我想這樣做的原因是保持每個音頻有多少獨特的下載總數。對於這種情況是否有其他方法? 我還有一個名爲AudioDownloadsByUser的獨立實體,它不是記錄IP,而是登錄時記錄用戶ID。 它們都從AudioHit繼承。 AudioHit - AudioDownloadByIp - AudioDownloadByUser 我要調查ISet和您的方法,將回發我的發現。 謝謝你們! Paul – 2009-12-17 15:48:51

+0

如果你想每個IP有獨特的下載,你也可以寫一個'獨特'的查詢來計算這個數字。 請注意:IP並不總是保證被同一個人始終使用。一些互聯網服務提供商不會在不同的時間點爲他們的用戶提供相同的IP,因此結果的價值可能不會那麼高(您使用登錄用戶的方法更可靠)...... – 2009-12-20 09:29:08

+0

我意識到,我知道這不會是100%,不幸的是我還需要保持未記錄成員的數量。 我正在使用會話,Cookie和IP地址的混合嘗試儘可能縮小它的範圍。 儘管感謝您的領導! – 2009-12-20 14:44:32

相關問題