Сохранение объекта ExpandoObject в MongoDB - PullRequest
5 голосов
/ 22 февраля 2011

У меня есть 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 ]

9 голосов
/ 21 декабря 2011

Это очень просто. ExpandoObject наследует IDictionary, который работает с BsonDocument из коробки.

dynamic data = new ExpandoObject();
var doc = new BsonDocument(data);
collection.Save(doc);
0 голосов
/ 23 марта 2011

Также вы можете попробовать использовать

BsonValue.Create(stat.Value)
0 голосов
/ 22 февраля 2011

Может быть, будет лучше использовать массив динамических объектов. что-то вроде этого:

someObject
{
      dynamicArray:
      {
           item : { Key: "Name", Value: "Jekke", Type:String }
           item : { Key: "Age", Value: "40", Type:int }
           item : { Key: "City", Value: "New York", Type:String }
      }
}
...