Jeu de MongoDB pour Sérialiser une classe comme BsonDocument
J'ai un Dictionary<string, object>
comme une insertion d'entrée pour MongoDB.Save()
.
Quand je remplir ce dictionnaire avec les types primitifs - le processus de sérialisation fonctionne très bien mais lorsque j'essaie d'insérer mon dictionnaire rempli avec une certaine classe personnalisée (par exemple, la classe Personne) j'obtiens l'erreur suivante:
.NET type 'Person' cannot be mapped to a BsonValue
J'ai remarqué que si j'insère mon type personnalisé converti à BsonDocument
le processus de sérialisation de l'excellent travail.
Comment puis-je définir MongoDB pour sérialiser une classe particulière comme BsonDocument
?
Mise à jour: real code fourni
here is my SensorData class:
[DataContract]
public class SensorData
{
[DataMember]
[BsonElement]
[BsonRepresentation(BsonType.String)]
public string Type { get; set; }
[DataMember]
[BsonElement]
[BsonRepresentation(BsonType.String)]
public string Desc { get; set; }
[DataMember]
[BsonElement]
[BsonRepresentation(BsonType.String)]
public SensorStatus Status { get; set; }
[DataMember]
[BsonElement]
[BsonRepresentation(BsonType.String)]
public string Value { get; set; }
[DataMember]
[BsonElement]
[BsonRepresentation(BsonType.String)]
public string ValueUnits { get; set; }
[DataMember]
[BsonElement]
[BsonRepresentation(BsonType.Boolean)]
public bool Event { get; set; }
[DataMember]
[BsonElement]
[BsonRepresentation(BsonType.Int32)]
public int TTL { get; set; }
}
Voici les méthodes qui enregistre les données dans MongoDB:
public void Save(Dictionary<string, object> RawSensorMessageDictionary)
{
try
{
var policyColl = new MongoClient(ConnString).GetServer().GetDatabase(DB_NAME).GetCollection<BsonDocument>(CollectionNames.RawSensorMessage.ToString());
if (!RawSensorMessageDictionary.Any(p => p.Key == "_id")) //if rawSensorMessageID is empty, mongodb will set it
RawSensorMessageDictionary.Add("_id", ObjectId.GenerateNewId().ToString());
var bsonObj = new BsonDocument(RawSensorMessageDictionary);
policyColl.Save(bsonObj);
}
catch (Exception ex)
{
//log exception
}
}
Et voici le code de mon UnitTest:
DataAccess.MongoDAL dal = new DataAccess.MongoDAL();
Dictionary<string, object> dic = new Dictionary<string, object>();
dic.Add("1", true);
dic.Add(Message.RESOURCE_TYPE, "aaa");
dic.Add(Message.RESOURCE_NAME, "bbb");
dic.Add(Message.SENSOR_DATA, new SensorData { Desc = "aaa", Event = true, Status = SensorStatus.Active, TTL = 4, Type = "sss", Value = "222" });
dal.SaveRawSensorData(dic );
Je veux que mon application pour Sérialiser automatiquement SensorData
objet de BsonDocument
. Si je ne suis pas le faire manuellement, je suis l'exception suivante: .NET type 'SensorData' cannot be mapped to a BsonValue
Comment dois je faire?
Mise à jour 2:
OK trouvé le problème, Dans mon "enregistrer dans la base de données" méthode que j'ai utilisé le code suivant dans le but de convertir mon dictionnaire BsonDocument
:
var bsonObj = new BsonDocument(RawSensorMessageDictionary);
Je m'attends à ce que la création d'une nouvelle instance de "BsonDocument" à partir d'un autre objet sera de gérer la conversion exactement comme object.ToBsonDocument()
n'mais apparemment, il ne l'est pas.
Enfin, j'ai remplacé le code ci-dessus à la suivante:
var bsonObj = RawSensorMessageDictionary.ToBsonDocument();
dal.SaveRawSensorData(dic );
maintenant ça fonctionne.
Vous devez vous connecter pour publier un commentaire.
Si la chaîne de caractères dans le dictionnaire de la propriété dans votre mongodb document, qu'un non type primitif est un sous-document dans mongodb. S'il vous plaît essayer de marquer toutes les propriétés de la classe avec
[BsonElement]
et la Bfils Id avec[BsonId]
. Et assurez-vous de suivre toutes les règles ici: Sérialiser des Documents avec le C# PiloteIl serait bien, si vous fournissez des informations un peu plus
EDIT 1
Je voudrais essayer de supprimer toutes les propriétés de
SensorData
outre Valeur. Si cela fonctionne, je voudrais ajouter que tous les autres (un par un).