2011-01-18 139 views
4

我喜欢在ravenDB中存储对象的方式,但有一个实际问题,我不确定最佳答案。儿童文档的RavenDB ID

可以说我有一个报价要求:

QuoteRequest.cs

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

Quote.cs

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

当有人点击一个网页,我吐了他们可以选择的报价列表。这些引号仅与报价请求的实例有关。

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

一个providerId可能会有多个引号。

我的想法是要么添加一个QuoteId并基于此增加它.Quotes.Count,但这似乎有点hacky,或生成一个随机数,也有点hacky。

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

回答

2

你真的需要购买(用户选择买什么)与原帖相关联?我猜你拿了报价,然后将其转换为购买。 如果是这样,那么不要担心身份证。只需将成分值传递给下一步即可。换句话说,像DDD意义上的价值一样对待报价。

但是,如果你做需要存储的关联采购......好吧,那就要看你真正需要跟踪。例如,您可以更新QuoteRequest,标记选定的报价。 (添加一个IsSelected或类似的报价类报价。)然后,购买可以链接回报价请求,并且您可以通过标志识别报价。

所有这一切都取决于上下文(我只是猜测)。

+0

这是最好的答案,所以我会继续并奖励它。我确实需要与原始报价相关联,所以我最终确定了如何强制儿童文档创建一个Id--它只是最简单的方法来完成它,尽管我确信有doc db/ddd纯粹主义者正在克制。谢谢! – ChickenMilkBomb

+0

我很高兴帮助! –

1

既然没有人回答过这个问题,我只会说我该怎么做;

为什么要添加一个Id?只需使用List的索引?它的请求是“?quote = 0”,他们得到位置0的报价?

不能确定如果我不在这里,虽然得到的东西......

0

一种选择是让父对象存储上次使用的ID。当添加一个新的子对象时,你增加了id计数器并将其添加到子项中。当对象被保存时,id计数器自动递增。

比方说你有博客文章与评论:

public class Post 
{ 
    public int NextCommentId; 
    public List<Comment> Comments; 
    ... 
} 

... 

var comment = new Comment { Id = post.NextCommentId++ }; 
post.Comments.Add(comment); 

session.SaveChanges(); 

上面的代码可能不是100%正确的,但应该给你如何至少做到这一点的想法!