繁体   English   中英

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

[英]c# MongoDB (noRM) - Repository pattern with embedded documents

我正在使用类似于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; }
}

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

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

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

interface IQuestionRepository
{
    void PutQuestion(Question question);
    Question GetQuestion(string questionID);
}  

interface IAnswerRepository
{
    void PutAnswer(string questionID, Answer Answer);
    Answer GetAnswer(string answerID);
}

或类似的东西:

interface IPostRepository
{
    void PutQuestion(Question question);
    Question GetQuestion(string questionID);
    void PutAnswer(string questionID, Answer Answer);
    Answer GetAnswer(string answerID);
}

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

问题应该是根文件。

答案应该是根文档。

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

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

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

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

我认为为每个聚合rute创建存储库会更好(仅适用于问题文档)

您不需要答案的存储库。 从域的角度来看,您应该只添加Question对象的答案。 问题存储库应该完成工作,因为问题看起来像聚合根,并且每个聚合根(而不是每个实体)应该有一个存储库。

你应该小心不要创建一个贫血领域模型

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM