Básicamente, quiero una colección que guarde varios tipos de objetos/documentos, pero todos heredan de una interfaz base. Sin embargo, sigo recibiendo esta excepción al cargar:
Additional information: An error occurred while deserializing the Inventory property of class Character: Unknown discriminator value 'TestItem'.
Aquí están mis códigos:
public class Character { ... public List<IInventoryItem> Inventory { get; set; } ... } public interface IInventoryItem { ... } class TestItem : IInventoryItem { ... }La ayuda es muy apreciada.
El problema es que no declara explícitamente sus tipos polimórficos en el controlador MongoDB.
Para eso, tiene dos opciones: usar atributos o un método de configuración de mapeo. Más información aquí:http://mongodb.github.io/mongo-csharp-driver/2.2/reference/bson/mapping/
Usando atributos:
[BsonDiscriminator("TestItem")] public class TestItem : IInventoryItem { ... }Usando el método de configuración de mapeo:
BsonClassMap.RegisterClassMap<TestItem>(); // do it before you access DB POR QUÉ: los documentos que representan tipos polimórficos (por ejemplo, interfaces) se guardan en la base de datos con un campo especial llamado _t , que contiene el valor del discriminador. En su caso, el documento de Character se verá así:
{ // ... other fields Inventory: [ { _t: "TestItem", //... other fields }, { _t: "TestItem", //... other fields } ] // ... other fields } Al escribir, si las asignaciones no existen, se crean sobre la marcha y el discriminador TestItem se asigna a la clase TestItem . A partir de ese momento, las asignaciones existen durante la vida del AppDomain . Así, por ejemplo, si realiza lecturas después de escrituras, estará bien.
Pero si lee los datos a primera hora, el serializador BSON no sabe a qué tipo se asigna el discriminador TestItem . Por lo tanto, es una buena práctica especificar siempre explícitamente las asignaciones de discriminadores. De esta forma, también puede controlar los valores del discriminador; por defecto, son iguales al tipo de nombre.