Установите MongoDB для сериализации класса как BsonDocumentC#

Место общения программистов C#
Ответить
Anonymous
 Установите MongoDB для сериализации класса как BsonDocument

Сообщение Anonymous »

У меня есть словарь в качестве входных данных для вставки для MongoDB.Save().

Когда я заполняю этот словарь примитивными типами, процесс сериализации работает нормально, но когда я пытаюсь вставить свой словарь, заполненный каким-то пользовательским классом (например, классом Person), я получаю следующую ошибку:

Код: Выделить всё

.NET type 'Person' cannot be mapped to a BsonValue
Я заметил, что если я вставлю свой собственный тип, преобразованный в BsonDocument, процесс сериализации работает отлично.

Как определить MongoDB для сериализации определенного класса как BsonDocument?



Обновление: предоставлен реальный код

Код: Выделить всё

    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; }
}
Вот методы, которые сохраняют данные в MongoDB:

Код: Выделить всё

public void Save(Dictionary RawSensorMessageDictionary)
{
try
{
var policyColl = new MongoClient(ConnString).GetServer().GetDatabase(DB_NAME).GetCollection(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
}
}
А вот код из моего UnitTest:

Код: Выделить всё

            DataAccess.MongoDAL dal = new DataAccess.MongoDAL();
Dictionary dic = new Dictionary();
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 );
Я хочу, чтобы мое приложение автоматически сериализовало объект SensorData в BsonDocument. Если я не сделаю это вручную, я получаю следующее исключение: Тип .NET «SensorData» не может быть сопоставлен с BsonValue

Как мне это сделать?



Обновление 2:
ОК, найдена проблема. В моем методе «сохранить в БД» я использовал следующий код, чтобы преобразовать мой словарь. BsonDocument:

Код: Выделить всё

        var bsonObj = new BsonDocument(RawSensorMessageDictionary);
Я ожидал, что создание нового экземпляра «BsonDocument» из другого объекта будет обрабатывать преобразование точно так же, как это делает object.ToBsonDocument(), но, по-видимому, это не так.

Наконец, я заменил приведенный выше код на следующий:

Код: Выделить всё

    var bsonObj = RawSensorMessageDictionary.ToBsonDocument();
dal.SaveRawSensorData(dic );
теперь это работает.

Подробнее здесь: https://stackoverflow.com/questions/265 ... ondocument
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»