【问题标题】:RavenDB ID for child documents子文档的 RavenDB ID
【发布时间】:2011-06-11 09:07:31
【问题描述】:

我喜欢对象在 ravenDB 中存储的干净程度,但有一个实际问题我不确定最佳答案。

假设我有一个报价请求:

QuoteRequest.cs

int Id;
dateTime DateCreated;
List<Quotes> Quotes;

Quote.cs

int ProviderId;
int Price;
int ServiceDays;
int ServiceTypeId;

当有人点击一个页面时,我会吐出一个他们可以从中选择的引用列表。这些报价仅与报价请求的一个实例相关。

我的问题是,由于子对象,例如列表中的报价,没有数据库生成的 Id,我如何生成查询字符串让下一页知道用户想要购买哪个报价?

一个 providerId 可以有多个引号。

我的想法是添加一个 QuoteId 并根据 this.Quotes.Count 增加它,但这似乎有点 hacky,或者生成一个随机数,也有点 hacky。

人们通常如何处理这样的事情?

【问题讨论】:

    标签: identifier ravendb document-database


    【解决方案1】:

    既然没有人回答这个问题,我就说一下我会怎么做;

    为什么要添加 ID?只使用列表的索引?如果请求是“?quote=0”,他们会在位置 0 获得报价?

    不太确定如果我在这里没有得到什么...

    【讨论】:

      【解决方案2】:

      您真的需要将购买(用户选择购买的商品)与原始报价相关联吗?我猜你接受了报价,然后将其转换为购买。 如果是这样,那么根本不用担心 id。只需将组成值传递到下一步。换句话说,将引用视为 DDD 意义上的值。

      但是,如果您确实需要存储与购买的关联...那么,这取决于您真正需要跟踪的内容。例如,您可以只更新 QuoteRequest,标记选定的报价。 (添加 IsSelected 或类似于报价类 Quote 的内容。)然后可以将购买链接回报价请求,您可以通过标志识别报价。

      同样,所有这些都取决于上下文(我只是对此进行猜测)。

      【讨论】:

      • 这是最好的答案,所以我要继续奖励它。我确实需要与原始报价相关联,所以我最终弄清楚了如何强制子文档创建一个 Id - 它最终成为了最简单的方法,尽管我确信有 doc db / ddd 纯粹主义者畏缩。谢谢!
      【解决方案3】:

      一种选择是让父对象存储最后使用的 id。添加新的子对象时,您增加 id-counter 并将其添加到子对象。保存对象时,id-counter 会自动递增。

      假设您有关于 cmets 的博客文章:

      public class Post
      {
        public int NextCommentId;
        public List<Comment> Comments;
        ...
      }
      
      ...
      
      var comment = new Comment { Id = post.NextCommentId++ };
      post.Comments.Add(comment);
      
      session.SaveChanges();
      

      上面的代码可能不是 100% 正确,但至少应该让您知道如何去做!

      【讨论】:

        猜你喜欢
        • 2011-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多