使用NoRM在MongoDB中进行延迟加载

时间:2010-10-21 16:37:27

标签: c# mongodb lazy-loading norm

我有一个类似于此的模型: (简化的)

问题:

public class Question
{
    public string QuestionID { get; set; }

    public string Title { get; set; }
    public string Body { get; set; }

    public List<Answer> Answers { get; set; }
}

答案:

public class Answer
{
    public string QuestionID { get; set; }
    public string Body { get; set; }
}

我打算将数据存储在MongoDB中,并希望使用NoRM

我的问题是:是否支持延迟加载?或者我可以将其设置为在文档存储上进行延迟加载..?

所以请求一个问题,也检索答案..? (两者都是存储在MongoDB上相同集合中的“帖子”)

2 个答案:

答案 0 :(得分:7)

好吧,“Lazy Loading”的概念对于像MongoDB这样的数据库来说大多是陌生的。请查看您的架构:Question的{​​{1}} List

RDBMS 中,“懒惰”部分允许您将“列表”与原始列表分开加载。实际上有两个查询正在发生,你只是想延迟第二个查询。

MongoDB 中,只发生了一个查询。 Answers已嵌入问题内,因此您对Answers的请求会自动包含Questions列表。

请查看NORM样本以获得更好的示例:http://normproject.org/samples

基本点是您提供的结构不再是多个表。它只是一个包含嵌入式文档的集合。所以“懒惰加载”的概念实际上是不必要的,因为你不能“懒惰加载”一个查询。

答案 1 :(得分:6)

我很欣赏这是一个老话题,但其他人可能仍在寻找它(就像我一样)。延迟加载在MongoDB中都是可能的,并且由C#驱动程序支持。

查看以下类:LazyBsonDocument和LazyBsonArray

来自C#驱动程序教程文档:“懒惰类是特殊的,因为它们推迟了BSON的反序列化,直到需要它为止。这对于你只需要复杂文档中的一个或两个字段是有用的,因为它不会产生反序列化整个文档或数组的成本,但只需要那些必要的部分。这种反序列化一次发生一个级别。“

在撰写本教程时,可以在此处找到教程文档:http://docs.mongodb.org/ecosystem/tutorial/use-csharp-driver/

给出的示例非常类似于它涉及嵌套集合的问题,因此如果需要,看起来答案列表确实可以延迟加载。

希望这有助于某人,

尼克