c#MongoDB(noRM) - 包含嵌入文档的存储库模式

Ale*_*lex 4 c# mongodb norm

我正在使用类似于Stack Overflow(问题/答案等)的 模型开发应用程序...使用C#/ ASP.net MVC建模NoSQL论坛应用程序

该模型看起来像这样(简化)

class Question
{
    public string Title { get; set; }
    public string Body { get; set; }
    public DateTime DateCreated { get; set; }

    public string UserName { get; set; }

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

class Answer
{
    public string Body { get; set; }
    public DateTime DateCreated { get; set; }

    public string UserName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

所以我的文档只是一个文档,其中嵌入了"答案"

我正在尝试为这种方法设计我的存储库.

我应该有2个独立的存储库吗?例如:

interface IQuestionRepository
{
    void PutQuestion(Question question);
    Question GetQuestion(string questionID);
}  
Run Code Online (Sandbox Code Playgroud)

interface IAnswerRepository
{
    void PutAnswer(string questionID, Answer Answer);
    Answer GetAnswer(string answerID);
}
Run Code Online (Sandbox Code Playgroud)

或类似的东西:

interface IPostRepository
{
    void PutQuestion(Question question);
    Question GetQuestion(string questionID);
    void PutAnswer(string questionID, Answer Answer);
    Answer GetAnswer(string answerID);
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*sic 6

你的模型本质上是有缺陷的.

问题应该是根文件.

答案应该是根文档.

关于RavenDB编写的文档建模信息大多可以直接用于您:http://codeofrob.com/archive/2010/12/21/ravendb-document-design-with-collections.aspx

编辑: FWIW您的模型存在缺陷的原因是您希望文档模拟事务边界的文档数据库.考虑堆栈溢出的编辑场景以及与多个人添加和更新所有更改根文档的答案保持一致性的噩梦是多少,并且海报正在更新问题.单个对象上的争用量很大.

RavenDB提供了他们称之为"修补"的东西,它可以让你操作文档结构的一部分而不是整个文档,以解决这样的问题,但这种设计最好先预先避免,而不是试图通过大大增加你的复杂性来使其工作.持久性模型必须进行部分更新并处理复杂的并发情况.

在此之后回答具体问题,那么你将拥有一个AnswersRepository和一个QuestsionsRepository