使用MongoDB和C#序列化对象图

时间:2012-07-18 12:08:55

标签: c# mongodb serialization mongodb-.net-driver bson

我有来自第三方开发人员的Winforms控件,并希望将其数据直接存储在MongoDB中。它是一个甘特图,有一个资源列表和一个约会列表。约会还有一个资源列表,负责将约会映射到资源。

为了简化存储,我创建了一个名为“PlanningDocument”的类:

public class PlanningDocument
{
[BsonId]
public ObjectId Id { get; set; }
public string Name { get; set; }
public ResourceCollection Resources { get; set; }
public ItemCollection Schedule { get; set; }
}

文档正确存储在数据库中(我使用MongoVUE来检查数据库的内容)。但是“Schedule”集合中的Items不包含在程序运行时期间对Resources的引用。

我需要做些什么来存储对象之间的引用关系?

编辑:我将尝试用更具体的例子解释我想要做什么:

    public class Identity
    {
        public string Id;

        public Identity()
        {
            Id = Guid.NewGuid().ToString();
        }
    }

    public class Thing : Identity
    {
        public string Name = "";
    }

    public class Drawer : Identity
    {
        public List<Thing> SomeThings;
        public List<Thing> AdditionalThings;

        public Drawer()
        {
            SomeThings = new List<Thing>();
            AdditionalThings = new List<Thing>();
        }
    }

我有这些课“Thing”和“Drawer”。抽屉可以包含“SomeThings”和“AdditionalThings”中的东西。

var d = new Drawer();
d.AdditionalThings.Add(new Thing() { Name = "Thing 1"});
d.AdditionalThings.Add(new Thing() { Name = "Thing 2" });
d.AdditionalThings.Add(new Thing() { Name = "Thing 3" });

d.SomeThings.Add(new Thing() { Name ="Thing A"});
d.SomeThings.Add(d.AdditionalThings[0]);

当我在两个列表中存储相同的Thing时(就像这里的“Thing 1”一样),MongoDB存储了Thing 1的副本 - 而不是引用。

我的问题是:是否存在一种通用的方法来使MongoDB和C#驱动程序在这里存储引用而不是副本?

提前致谢 Achim的

1 个答案:

答案 0 :(得分:0)

不,无法在C#驱动程序中自动存储引用。这是设计因为自动存储引用意味着我们将在运行时自动解析这些引用,这是我们不做的。

由于您的“thing”对象具有标识,因此当您更新其中一个对象时,通过在客户端执行或使用位置$编写相应的更新语句来保持它们同步并不困难。运算符和update-multi标志。