Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.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# 如何在反序列化的MongoDB文档中获取对父对象的引用?_C#_Mongodb_Deserialization - Fatal编程技术网

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

C# 如何在反序列化的MongoDB文档中获取对父对象的引用?,c#,mongodb,deserialization,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

我希望有人能帮忙。我开始了解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();
    }
}
请注意,子项具有引用其父项的属性。因此,在创建对象时,我会这样做:

        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"
}
问题是:当我反序列化时,我失去了子项对其父项的引用。有没有办法配置反序列化以使ParentThing属性始终是其父文档?

来自mongodb网站

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


因此,
Thing
将实现
ISupportInitialize
,函数
BeginInit
将保持为空,
Endinit
将包含
St.ParentThing=this

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

一种方法是让类在反序列化后提供钩子。这可能是解决当前问题的最简单方法。否则,同一链接还显示了如何编写自定义序列化程序,但在本例中不需要这样做。

darn。19秒!!:-)+从我这里得到1