3

ドメイン エンティティ Contacts があり、Contact は MemberOf プロパティを介してリストに関連付けられています (RavenDB のリスト ID を含みます)

public class Contact
{
    public string Id { get; set; }
    public string Email { get; set; }
    public string Name { get; set; }
    public string Country { get; set; }
    public List<string> MemberOf { get; set; }
}

RavenDBを使用して連絡先を保存したいと考えています。連絡先をアップロードする方法の 1 つは、CSV ファイル (一括) を使用することです。2 つの CSV ファイルに同じ連絡先がある場合、データの重複を防ぐにはどうすればよいか考えていました。同じメールアドレスがある場合、連絡先は同じであると見なします - これは私のドメイン ロジックに関連しています。連絡先は、2 つの異なる CSV リストの MemberOf になることができます。たとえば
、同じ電子メール アドレス フィールドを持つ 2 つの CSV リストをアップロードしています。問題は、連絡先クラスに MemeberOf を設定して 2 つのリストを持たせたいことです。これにより、重複を防ぐことができます。アプリケーションのドメイン ロジックでは、統計分析のために電子メールごとに 1 つの連絡先オブジェクトが必要だったため、各リストのエントリ。

私の設計にも挑戦してください。ここには最適なデータ モデルがない可能性があります。

ありがとうございました

4

1 に答える 1

4

RavenDBが強制する唯一の一意の制約は、ドキュメントIDです。したがって、使用できる1つの方法は、電子メールアドレスをドキュメントIDにすることです。次に、次のようなコードを記述できます。

using (var session = docStore.OpenSession())
{
    foreach (var csvItemToImport in csvfile)
    {
        var existingDoc = session.Load<Contact>(csvItemToImport.Email);    
        if (existingDoc == null)
        {
            //No doc with the given email exists, add a new one
            session.Store(new Contact{ ... });
        }
        else
        {
            existingDoc.MemberOf.Add(csvItemToImport.ListName)
            // No need to store the doc, it's tracked in the session automatically
        }     
    }
    //Save the changes so far back to the dBase, in a single batched transaction
    session.SaveChanges();
}

ドキュメントIDはURL(/docs/contacts/blah@blah.co.uk)であるため、電子メールアドレスの「@」を説明するためにエスケープを行う必要がある場合があります。

そしてあなたのPOCOはこのようになります:

public class Contact
{
    public string Id { get; set; } //this is actually an email address 
    public string Name { get; set; }
    public string Country { get; set; }
    public List<string> MemberOf { get; set; }
}

ドキュメントIDを電子メールアドレスにしたくない場合は更新します(何らかの理由で)。ここで概説されている方法を使用できます。毎回2つのドキュメントを保存するだけです。1つのContactドキュメントと、一意の制約を保証する別のドキュメントです。

于 2012-04-26T20:00:22.873 に答える