0

我有一个来自第 3 方开发人员的 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 检查数据库的内容)。但是“计划”集合中的项目不包含对资源的引用,因为它在程序运行时。

我必须做什么来存储对象之间的引用关系?

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

    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>();
        }
    }

我有这些类“东西”和“抽屉”。抽屉可以包含“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]);

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

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

提前感谢阿奇姆

4

1 回答 1

0

不,没有办法在 C# 驱动程序中自动存储引用。这是设计使然,因为自动存储引用意味着我们将在运行时自动解析这些引用,而我们不会这样做。

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

于 2012-07-20T13:25:38.663 回答