如何在反序列化的MongoDB文档中获取对父对象的引用?

时间:2015-02-19 19:46:09

标签: c# mongodb deserialization

我希望有人可以提供帮助。我正在掌握MongoDB的C#驱动程序以及它如何处理序列化。请考虑以下示例类:

class Thing
{
    [BsonId]
    public Guid Thing_ID { get; set; }
    public string ThingName {get; set; }
    public SubThing ST { get; set; }

    public Thing()
    {
        Thing_ID = Guid.NewGuid();
    }
}

class SubThing
{
    [BsonId]
    public Guid SubThing_ID { get; set; }
    public string SubThingName { get; set; }
    [BsonIgnore]
    public Thing ParentThing { get; set; }

    public SubThing()
    {
        SubThing_ID = Guid.NewGuid();
    }
}

请注意,SubThing具有引用其父级的属性。因此,在创建对象时,我这样做:

        Thing T = new Thing();
        T.ThingName = "My thing";

        SubThing ST = new SubThing();
        ST.SubThingName = "My Subthing";

        T.ST = ST;
        ST.ParentThing = T;

ParentThing属性设置为BsonIgnore,否则在序列化到MongoDB时会导致循环引用。

当我对MongoDB进行序列化时,它会根据我的预期创建文档:

{
"_id" : LUUID("9d78bc5c-2abd-cb47-9478-012f9234e083"),
"ThingName" : "My thing",
"ST" : {
    "_id" : LUUID("656f17ce-c066-854d-82fd-0b7249c80ef0"),
    "SubThingName" : "My Subthing"
}

问题在于:当我反序列化时,我松开了SubThing对其父级的引用。有没有办法配置反序列化,以便ParentThing属性始终是其父文档?

2 个答案:

答案 0 :(得分:5)

来自mongodb网站

  

实施ISupportInitialize -   驱动程序尊重实现ISupportInitialize的实体,该实体包含两个方法,BeginInit和EndInit。在反序列化开始之前和完成之后调用这些方法。在反序列化之前或之后运行操作非常有用,例如处理模式更改是预先计算一些昂贵的操作。

因此,Thing将实施ISupportInitialize,功能BeginInit将保持为空,Endinit将包含St.ParentThing = this;

答案 1 :(得分:1)

在这种抽象层次上,很难给出明确的答案。

一种方法是让类implement ISupportInitialize在反序列化后提供一个钩子。对于手头的问题,这可能是最简单的解决方案。否则,同一链接也会显示如何编写自定义序列化程序,但在这种情况下不应该这样做。