在RavenDB中“加入”两个实体集的正确模式是什么?

时间:2012-10-31 11:26:56

标签: asp.net-mvc ravendb

在ASP.NET MVC(4)应用程序中使用RavenDB,加载一组相关实体并将它们传递给视图的正确模式是什么?

将Stack Overflow作为规范示例,假设以下实体:

class User
{
    public int Id { get; set; }

    public string UserName { get; set; }
}

class Comment
{
    public int Id { get; set; }

    public string Body { get; set; }

    public string Author{ get; set; }
}

class Question
{
    public int Id { get; set; }
    // ...
    public List<Comment> Comments { get; set; }

    public Question()
    {
        Comments = new List<Comment>();
    }
}

我们想要做的是在问题下的评论旁边显示用户信息。评论存储在问题文档的一部分中,因此我们Include Comment.Author

我们的查询可能如下所示:

var question = RavenSession.Include<Question>(x => x.Author)
                           .Include<Comment>(x => x.Author)
                           .Load<Question>(id);

现在我们有问题对象及其所有注释,而Raven客户端已经缓存了我们需要的所有用户配置文件,将用户对象与用户对象配对的正确/最佳/最RavenDB批准方式是什么相关评论对象?

有一种想法是我可以将UserComment转换为CommentViewModel并将其发送到客户端,但这似乎非常手动。

另一个选项可能是为作者的Comment添加另一个属性,即[JsonIgnore]',并且在getter中,懒惰加载来自Raven会话的用户。这感觉很脏,因为Comment模型对象需要持有对乌鸦会话的引用。

1 个答案:

答案 0 :(得分:1)

你想这样做:

var question = RavenSession.Include<Question>(x => x.Author)
                           .Include(x => x.Comments.Select(c=>c.Author))
                           .Load(id);

这适用于1.2,注意。 然后你可以调用Load(question.Author)从会话缓存中获取文档。