Tengo un modelo como el siguiente:
[BsonIgnoreExtraElements] public class MongoDbLogModel { public string Level { get; set; } public string RenderedMessage { get; set; } [BsonDateTimeOptions(Kind = DateTimeKind.Local)] public DateTime? Timestamp { get; set; } [BsonDateTimeOptions(Kind = DateTimeKind.Local)] public DateTime UtcTimeStamp { get; set; } public dynamic Properties { get; set; } public dynamic Exception { get; set; } }Y aquí está el modelo JSON:
{ "_id": { "$oid": "61a8dadd1ab0e48d55b06626" }, "Level": "Error", "UtcTimeStamp": { "$date": "2021-12-02T14:40:30.436Z" }, "MessageTemplate": {...}, "RenderedMessage": "", "Properties": {...}, "Exception": { "_t": "SqlException", "HelpLink": null, "Source": "Core Microsoft SqlClient Data Provider", "HResult": -2146232060, "Message": "Invalid object name 'SystemControlLogs'.", "StackTrace": " at Microsoft.Data.SqlClien", "Data": {...} } }Y aquí está mi código para obtener datos de registro:
var logs = await _collection .Find(builder) .Skip(count * page) .Limit(count) .SortByDescending(entry => entry.Timestamp) .ToListAsync(); Me enfrento a la excepción Unknown discriminator value "SqlException" al deserializar datos. ¿Hay alguna forma de deshacerse de esa excepción sin crear un modelo para la propiedad Exception ? ( BsonClassMap.RegisterClassMap<MongoDbLogModel>(); pero no tuve suerte).
probablemente tenga un tipo que se verifique en tiempo de ejecución. Creo que Dynamic no es compatible con el controlador MongoDB (aunque no se ha declarado oficialmente) y la solución recomendada es usar BsonDocument en su lugar.
Mezcla de datos estáticos y dinámicos: documentación oficial
No estoy seguro de que BsonDocument sea aplicable para usted, pero esta solución es la más simple:
[BsonIgnoreExtraElements] public class MongoDbLogModel { public string Level { get; set; } public string RenderedMessage { get; set; } [BsonDateTimeOptions(Kind = DateTimeKind.Local)] public DateTime? Timestamp { get; set; } [BsonDateTimeOptions(Kind = DateTimeKind.Local)] public DateTime UtcTimeStamp { get; set; } //changed line [BsonElement("Properties")] public BsonDocument Properties { get; set; } //changed line [BsonElement("Exception")] public BsonDocument Exception { get; set; } }si BsonDocument no sirve para su propósito. tienes que implementar un serializador personalizado. algo como esto: serializar datos dinámicos con mongodb