Сохранение объекта ExpandoObject в MongoDB
У меня есть ExpandoObject с произвольным количеством свойств. Я хочу сохранить эти свойства в базе данных MongoDB как BsonDocument. Я пытаюсь сделать это с помощью следующего кода:
private BsonDocument GetPlayerDocument(IPlayer player)
{
var ret = new BsonDocument();
ret.Add("FirstName", player.FirstName).
Add("LastName", player.LastName).
Add("Team", player.Team).
Add("Positions", new BsonArray(player.Positions));
foreach (var stat in (IDictionary<String, Object>)player.Stats)
{
ret.Add(stat.Key, stat.Value.ToBson());
}
return ret;
}
Однако при вызове метода расширения ToBson() для объекта я получаю следующее исключение: WriteInt32 не может быть вызвано, когда State имеет значение: Initial.
Единственный известный мне WrtieInt32 - это статический метод класса Маршалла. Я подхожу к этому неправильно?
3 ответа
Это очень просто. ExpandoObject
наследуется IDictionary
который работает с BsonDocument
из коробки.
dynamic data = new ExpandoObject();
var doc = new BsonDocument(data);
collection.Save(doc);
Также вы можете попробовать использовать
BsonValue.Create(stat.Value)
Может быть, будет лучше использовать массив динамических объектов. что-то вроде этого:
someObject
{
dynamicArray:
{
item : { Key: "Name", Value: "Jekke", Type:String }
item : { Key: "Age", Value: "40", Type:int }
item : { Key: "City", Value: "New York", Type:String }
}
}