0

Campaignいくつかの文字列プロパティとオブジェクトのコレクションを含むというドメインオブジェクトがありTrackingEntryます。ドキュメントセッションからクエリを取得するときは常に、少なくとも1つの追跡エントリが保存されていても、このプロパティは空です。トラッキングエントリコレクションも取得されるように、キャンペーンオブジェクトの取得にどのようにアプローチできますか?に関連するコードは次の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;
            }
        }

追跡エントリが1つあることは知っていますが、ブレークポイントを設定すると、空のコレクションが表示されます。レイヴンキャッシングと古いインデックスの可能性があると思いましたが、データベースにレコードを書き込んでから24時間経っても問題は解決していません。そのコレクションを処理するには、おそらくmap-reduceインデックスが必要だと思いますが、それでもそれらがどのように機能するかについては非常に曖昧です。考え?

4

1 に答える 1

3

唯一の問題は、プロパティの設定方法にあります。デフォルトでは、プライベート フィールドはシリアル化されず、セッターが定義されている場合にのみパブリック プロパティが逆シリアル化されます。セッター自体は、パブリックまたはプライベートにすることができます。リストの初期化が心配な場合は、コンストラクターで実行してください。

最も単純なアプローチは次のとおりです。

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 に答える