Warum haben Sie dieselbe "öffentliche ObjectId-ID"? in jeder abgeleiteten Klasse? Es ist keine wirklich gute Idee. Es verbirgt das übergeordnete ID-Feld.
Um Ihr Problem zu lösen, müssen Sie Ihre abgeleiteten Klassen "registrieren" (wie bei jedem Serialisierungs-/Deserialisierungsmechanismus). Es gibt drei Möglichkeiten, dies zu tun:
-
Deklarativer Weg - Basisknotenklasse dekorieren mit:
[BsonKnownTypes(typeof(PlotNode), typeof(EndNode))]
-
Generischer Weg - wenn Typen zur Kompilierzeit bekannt sind:
BsonClassMap.RegisterClassMap<PlotNode>(); BsonClassMap.RegisterClassMap<EndNode>();
-
Dynamischer Weg - wenn Typen zur Kompilierzeit unbekannt sind:
BsonClassMap.LookupClassMap(typeof(PlotNode)); BsonClassMap.LookupClassMap(typeof(EndNode));
-
Noch ein Vorschlag - Verwenden Sie LINQ anstelle von Query
Node node = collection.AsQueryable().FirstOrDefault(n => n.Id == id);