Dlaczego masz ten sam „publiczny identyfikator obiektu”; w każdej klasie pochodnej? To nie jest dobry pomysł. Ukrywa pole nadrzędnego identyfikatora.
Aby rozwiązać problem, musisz "zarejestrować" swoje klasy pochodne (jak w każdym mechanizmie serializacji/deserializacji). Można to zrobić na 3 sposoby:
-
Sposób deklaratywny - udekoruj klasę bazową Node za pomocą:
[BsonKnownTypes(typeof(PlotNode), typeof(EndNode))]
-
Ogólny sposób - kiedy typy są znane w czasie kompilacji:
BsonClassMap.RegisterClassMap<PlotNode>(); BsonClassMap.RegisterClassMap<EndNode>();
-
Dynamiczny sposób - gdy typy są nieznane w czasie kompilacji:
BsonClassMap.LookupClassMap(typeof(PlotNode)); BsonClassMap.LookupClassMap(typeof(EndNode));
-
Kolejna sugestia - użyj LINQ zamiast Query
Node node = collection.AsQueryable().FirstOrDefault(n => n.Id == id);