我希望有人可以提供帮助。我正在掌握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属性始终是其父文档?
答案 0 :(得分:5)
来自mongodb网站
实施ISupportInitialize - 驱动程序尊重实现ISupportInitialize的实体,该实体包含两个方法,BeginInit和EndInit。在反序列化开始之前和完成之后调用这些方法。在反序列化之前或之后运行操作非常有用,例如处理模式更改是预先计算一些昂贵的操作。
因此,Thing
将实施ISupportInitialize
,功能BeginInit
将保持为空,Endinit
将包含St.ParentThing = this;
答案 1 :(得分:1)
在这种抽象层次上,很难给出明确的答案。
一种方法是让类implement ISupportInitialize在反序列化后提供一个钩子。对于手头的问题,这可能是最简单的解决方案。否则,同一链接也会显示如何编写自定义序列化程序,但在这种情况下不应该这样做。