2013-01-06 29 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