0

我有一个名为的域对象Campaign,其中包含一些字符串属性和一组TrackingEntry对象。每当我从文档会话中检索查询时,此属性为空,即使我至少保存了一个跟踪条目。如何检索活动对象以便同时检索跟踪条目集合?以下是相关代码Campaign

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 小时,问题仍然存在。我在想我可能需要一个 map-reduce 索引来处理该集合,但对它们的工作方式仍然很模糊。想法?

4

1 回答 1

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>()); }
    }
}
于 2013-01-06T16:14:48.033 回答