Mongo db C # сериализация - PullRequest
       23

Mongo db C # сериализация

0 голосов
/ 14 февраля 2012

Я пытаюсь написать следующий код, используя драйверы 10gen C # для Mongo Db.Здесь я пытаюсь добиться того, чтобы написать простой адаптер, чтобы беспрепятственно кэшировать объекты C #.

RegisterClassMap () не может распознать поле CacheId из контракта класса.Я не смог найти достаточно документации по API MapIdField.

Может кто-нибудь помочь?Заранее спасибо !!

public interface ICacheable
{
    byte[] CacheId { get; }
}

public class Contract : ICacheable
{
    public byte[] CacheId { get; set; }

    public string Name { get; set; }

    public string Description { get; set; }
}

public class MongoCacheStore
{
    private void RegisterClass<T>() where T : class, ICacheable
    {
        if (!BsonClassMap.IsClassMapRegistered(typeof(T)))
        {
            BsonClassMap.RegisterClassMap<T>();

            BsonClassMap.RegisterClassMap<T>(cm =>
            {
                cm.AutoMap();
                **cm.MapIdField("CacheId");**
            });
        }
    }
}

1 Ответ

3 голосов
/ 15 февраля 2012

У меня сработало следующее:

public class MongoCacheStore
{
    public void RegisterClass<T>() where T : class, ICacheable
    {
        BsonClassMap.RegisterClassMap<T>(cm =>
        {
            cm.AutoMap();
            cm.MapIdProperty("CacheId");
        });
    }
}

Вы должны использовать MapIdProperty вместо MapIdField, потому что CacheId является свойством.

Вы имели в виду, что в интерфейсе не было установленного аксессора?

Кроме того, гораздо лучше, если вы организуете, чтобы RegisterClass вызывался только один раз, вместо того, чтобы каждый раз проверять IsClassMapRegistered. Во-первых, я не думаю, что это потокобезопасно, как написано (два потока могут получить ложное возвращение от вызова IsClassMapRegistered, и один из них потерпит неудачу при вызове RegisterClassMap).

...