2012-04-26 41 views
3

我有一个域实体联系人,联系方式与通过的memberOf属性列表相关联(包含RavenDB列表ID)我怎样才能有效地检查文档的存在,在RavenDB

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来存储联系人,上传联系人的方法之一是通过CSV文件(批量)。我在考虑如何防止重复数据,当两个CSV文件具有相同的联系人时,我认为联系人具有相同的电子邮件时是相同的 - 这与我的域逻辑有关。联系人可以是会员的两个不同的CSV列表,例如
我上传了两个具有相同电子邮件地址字段的CSV列表,问题是我希望联系人类将MemeberOf设置为具有两个列表,这样可以避免我为每个列表重复条目,因为域逻辑我的应用程序需要每个电子邮件一个联系对象进行统计分析

请挑战我的设计,我可能没有最好的数据模型在这里。

谢谢

+0

每次导入需要上传多少个文档,您希望运行多少个导入以及您期望总共导入多少个文档? – 2012-04-26 19:46:13

+0

在我的答案下面解决了你的问题? – 2012-04-27 09:32:16

回答

4

RavenDB为您执行的唯一唯一约束是文档ID。因此,您可以使用的一种方法是使电子邮件地址成为文档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(); 
} 

因为文件编号是url(/docs/contacts/[email protected]),你可能需要做一些逃往占“@”:那么你可以这样写代码。

和你的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; } 
} 

更新,如果你不希望文件编号为(无论何种原因)的电子邮件地址。您可以使用方法outlined here。它每次只存储两个文档,即Contact文档和另一个确保唯一约束的文档。

+0

只要每个电子邮件地址都是唯一的联系人,我同意此解决方案。如果你想支持电子邮件地址改变和反映同一联系人的能力,那么你需要一个不同的ID。此外,else块中的session.Store()是多余的,因为existingDoc已被跟踪。您可以删除该行以获得轻微的性能提升。最后一个注意事项是,如果您只是想在不加载文档的情况下检查文档是否存在,请使用session.Advanced.DatabaseCommands.Head()。它只会加载标题而不是整个文档。 – 2012-05-01 17:46:53

+0

谢谢Matt,我会更新我的回答 – 2012-05-02 09:58:31

+0

另请参阅最后的“更新”部分,了解如何更改电子邮件地址 – 2012-05-02 10:00:52