MongoDB C#实体映射:“一对多关系”

时间:2015-03-06 18:31:42

标签: c# mongodb

我是MongoDb的新手,但我知道在文档数据库中谈论关系是闻到的。无论如何,我只是想了解它是否符合我的需求以及它的极限。

我的域名中只有一个简单的c#实体:

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

    public string Name { get; set; }

    public string Surname { get; set; }

    public ICollection<Person> Friends { get; set; }
}

我只是希望序列化过程使该集合成为一种

列表
["...api/persons/1", "...api/persons/2", ...]

有可能吗?

1 个答案:

答案 0 :(得分:6)

  

文档db中的关系是闻到的东西

不,一点也不。可悲的是,这个概念很受欢迎,但非关系数据库中的关系没有任何问题。这只是管理这些关系的另一种方法。

但是让我们来看看你的模特:

public ICollection<Person> Friends { get; set; }

正如您可能已经想到的那样,将序列化文档的

{ "name" : "doe",  
  "firstName" : "john", 
  "friends" : [ 
      { "name" : "rogers", 
        "firstName" : "mike", 
        "friends" : [ {"name" : "myers", "firstName" : "lucy", ... },  
        ... ] },
 ... ] }

换句话说,这些不会序列化为关系,而是序列化为嵌入式文档

现在最简单,最干净的方法是在你想要关系时存储关系:

class Person {
    public ObjectId Id { get; set; }
    public string FirstName { get; set; }
    public List<ObjectId> FriendIds { get; set; }
}

这需要从您的域模型手动转换为与数据库兼容的模型,这就引出了您首先想要域模型的问题。

域模型的问题是它们需要RAM中的部分序列化图形。这似乎很方便从.NET端使用,例如你可以做点什么

person.Friends.First().Friends.Where(p => p.Name == "Doe").Friends.Last...

但是完全不清楚如何从数据库中获取所有这些内容,因为这个简单的单行表达式可能需要至少 4次往返数据库。虽然可以实现这样的映射(透明激活),但它隐藏了程序员的许多重要信息。

如果你在等式中添加修改(和修改跟踪),事情会很快变得非常混乱。

此外,该模型看起来像是对我的m:n关系(一个人可以有很多朋友,一个人可以被许多其他人称为朋友,对吧?)。对于m:n关系,嵌入引用列表可能不是最佳方法,但there are alternatives.