2013-01-06 30 views
0

我有一個域對象調用Campaign它包含了一些字符串屬性和TrackingEntry對象的集合。每當我檢索文檔會話的查詢,這個屬性是空的,即使我有至少一個跟蹤條目保存。我該如何處理檢索廣告系列對象,以便追蹤跟蹤條目集合?下面是爲Campaign相關代碼:RavenDB查詢不補水枚舉財產

public class Campaign : Entity 
{ 
    private ICollection<TrackingEntry> trackingEntries; 

    public string BrandId { get; set; } 

    public ICollection<TrackingEntry> TrackingEntries 
    { 
     get { return trackingEntries ?? (trackingEntries = new Collection<TrackingEntry>()); } 
    } 
} 

有問題的方法發生在一個逗號分隔的品牌ID的字符串,檢索與這些品牌ID的所有活動,遍歷並執行基於內容的一些自定義邏輯跟蹤條目集合的其他內容。以下是有關部分:

 var brandIds = input.Split(','); 
     var campaigns = session.Query<Campaign>().Where(x => x.BrandId.In(brandIds)); 
     foreach (var campaign in campaigns) 
     { 
      DateTime? dateClaimed = null; 
      var trackingEntry = campaign.TrackingEntries.FirstOrDefault(x => x.ConsumerId == consumer.Id); 
      if (trackingEntry != null) 
      { 
       dateClaimed = trackingEntry.CreatedOn; 
      } 
     } 

我知道有一個跟蹤條目,但設置一個斷點顯示一個空的集合。我想這可能是烏鴉緩存和一個陳舊的指標,但這個問題仍然是寫在這裏記錄到數據庫後24小時。我在想,我可能需要一個地圖,減少索引來處理該集合,但我仍然對他們的工作很朦朧。思考?

回答

3

唯一的問題是在您設置屬性的方式。默認情況下,私有字段不會被序列化,並且公共屬性只有在您定義了setter時纔會反序列化。制定者本身可以是公共或私人的。如果您關心初始化列表,只需在構造函數中進行。

這是最簡單的方法:

public class Campaign : Entity 
{ 
    public Campaign() 
    { 
     TrackingEntries = new Collection<TrackingEntry>(); 
    } 

    public string BrandId { get; set; } 

    public ICollection<TrackingEntry> TrackingEntries { get; private set; } 
} 

這同樣適用於任何集合類型。 (陣列,列表,枚舉等)

一種替代方法將是通過歸屬。但我認爲第一種方法更好,因爲它使您的實體免受依賴關係,並且更易於閱讀。

public class Campaign : Entity 
{ 
    [JsonProperty("TrackingEntries")] 
    private ICollection<TrackingEntry> trackingEntries; 

    public string BrandId { get; set; } 

    [JsonIgnore] 
    public ICollection<TrackingEntry> TrackingEntries 
    { 
     get { return trackingEntries ?? (trackingEntries = new Collection<TrackingEntry>()); } 
    } 
} 
+1

我完全忽略了一個事實,即當您與Raven交互時,您正在序列化和解序列化json - 感謝Matt,已修復! – levelnis