Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# c MongoDB(noRM)-具有嵌入式文档的存储库模式_C#_Mongodb_Norm - Fatal编程技术网

C# c MongoDB(noRM)-具有嵌入式文档的存储库模式

C# c MongoDB(noRM)-具有嵌入式文档的存储库模式,c#,mongodb,norm,C#,Mongodb,Norm,我正在开发一个应用程序,其模型类似于堆栈溢出问题/答案等。。。 模型看起来像这样 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&g

我正在开发一个应用程序,其模型类似于堆栈溢出问题/答案等。。。

模型看起来像这样

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; }
}
或者像这样:

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

我认为最好为每个聚合ruteonly for Question文档创建存储库,因为您的模型本身就有缺陷

问题应该是根文档

答案应该是根文档

虽然是针对RavenDB编写的,但文档建模信息主要可供您直接使用:

编辑:FWIW您的模型有缺陷的原因是您希望您的文档对事务边界进行建模。想象一下堆栈溢出的编辑场景,如果要与多人保持一致,添加和更新答案会改变根文档,海报会更新问题,这将是一场多么可怕的噩梦。单个对象上的争用量将非常有问题

RavenDB提供了他们称之为修补的功能,允许您操作文档结构的一部分,而不是整个文档,以准确地解决此类问题,但最好避免这种设计,而不是通过大幅增加必须进行部分更新和处理的持久性模型的复杂性来尝试使其工作详细说明并发情况


在这之后要回答特定的问题,你需要一个答案库和一个问题库,你不需要答案库。从域的角度来看,您应该只将答案添加到您的问题对象中。问题存储库应该完成这项工作,因为问题看起来像一个聚合根,并且您应该为每个聚合根而不是每个实体拥有一个存储库


您应该小心不要创建一个。

-1此设计将导致大量的工作。看看我的答案,为什么这是糟糕的设计。域建模和持久性建模是两个截然不同的主题,后者与持久性机制密切相关。很多时候,持久化模型可以接受域实体,但也有一些时候这会很糟糕,比如这个案例。我没有注意到Rob的这篇文章。。我现在已经读过了,并对我的模型做了一些修改。@alexjamesbrown我知道你接受了这个问题的答案,你觉得这是正确的方法吗?从那时起,随着时间的推移?冒着被激怒的风险,我不同意模型本身存在缺陷。在我看来,认为事务边界是正确的设计模型的想法是不完整的,因为它没有考虑最常见的用例,在stackoverflow示例中,它是读取数据,而不是写入数据。按照这里的逻辑,我们对一个额外的查询施加一个额外的限制,以简化最不常见的用例。此外,MongoDB还提供了一个就地更新功能,专门针对大量同时写作的人scenario@eggheaddesign我们必须同意不同意,在实际交易边界存在的地方,我绝对坚持我的观点。NoSQL系统通常也是以读为导向的,因此我不会选择单独查询的成本,而不是处理极度并发的数据访问的成本。此外,这是优化的一个问题,可以减少查询的数量,并且有一些方法可以克服这种依赖于提供者的问题。我只能具体地说RavenDB,但它可以存储伪子文档,您可以在一个查询中检索它。
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);
}