Set MongoDB zu Serialisieren einer Klasse als BsonDocument
Ich habe eine Dictionary<string, object>
als INSERT-Eingang für MongoDB.Save()
.
Wenn ich füllen Sie dieses Wörterbuch mit primitiven Typen - die Serialisierungs-Prozess funktioniert gut, aber wenn ich versuche, einfügen mein Wörterbuch, gefüllt mit einige benutzerdefinierte Klasse (z.B. Klasse "Person") bin ich immer der nächste Fehler:
.NET type 'Person' cannot be mapped to a BsonValue
Bemerkte ich, dass, wenn ich stecken meine benutzerdefinierten Typ umgewandelt BsonDocument
den serialisierungsvorgang große Arbeit.
Wie kann ich festlegen, MongoDB serialisieren, die eine bestimmte Klasse als BsonDocument
?
Update: real code
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; }
}
Hier ist die Methoden, die speichert die Daten in 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
}
}
Und hier ist der code von meinem 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 );
Ich möchte, dass meine app zu Serialisieren automatisch SensorData
Objekt BsonDocument
. Wenn ich nicht mache es manuell, ich bekomme die folgende exception: .NET type 'SensorData' cannot be mapped to a BsonValue
Wie soll ich es tun?
Update 2:
OK das Problem entdeckt, In meinem "save to db" Methode, die ich verwendete den folgenden code, um meine konvertieren Wörterbuch BsonDocument
:
var bsonObj = new BsonDocument(RawSensorMessageDictionary);
Ich würde erwarten, dass die Schaffung einer neuen Instanz von 'BsonDocument' aus anderen Objekt behandeln die Konvertierung genau wie object.ToBsonDocument()
tut es aber scheinbar nicht.
Schließlich ersetzte ich den obigen code die folgende:
var bsonObj = RawSensorMessageDictionary.ToBsonDocument();
dal.SaveRawSensorData(dic );
jetzt funktioniert es.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn die Zeichenfolge in das Wörterbuch ist die Eigenschaft in der mongodb-Dokument, als ein nicht primitiven Typ ist ein Filialdokument in mongodb. Bitte versuchen Sie, alle zu markieren, Eigenschaften in der Klasse mit
[BsonElement]
und die Bson-Id mit[BsonId]
. Und seien Sie sicher, Sie befolgen alle Regeln von hier: Serialisieren von Dokumenten mit der C# - TreiberEs wäre schön, wenn du uns mehr Informationen
BEARBEITEN 1
Ich würde versuchen, entfernen Sie alle Eigenschaften von
SensorData
neben Wert. Wenn das funktioniert, würde ich als fügen Sie alle anderen (nacheinander).