我正在尝试使用10gen C#驱动程序为Mongo Db编写以下代码。我在这里想要实现的是编写一个简单的适配器,以便无缝地缓存C#对象。
RegisterClassMap()无法识别类合约中的CacheId字段。我在MapIdField api上找不到足够的文档。
有人可以帮忙吗?在此先感谢!!
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");**
});
}
}
}
答案 0 :(得分:3)
以下对我有用:
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时会失败)。