Mongo db C#序列化
我试图使用Mongo Db的10gen C#驱动程序编写以下代码。我在这里试图实现的是编写一个简单的适配器,以便无缝地缓存C#对象 RegisterClassMap()无法从类协定中识别CacheId字段。我找不到足够的关于MapIdField api的文档 有人能帮忙吗?提前谢谢Mongo db C#序列化,c#,serialization,mongodb,mongodb-.net-driver,C#,Serialization,Mongodb,Mongodb .net Driver,我试图使用Mongo Db的10gen C#驱动程序编写以下代码。我在这里试图实现的是编写一个简单的适配器,以便无缝地缓存C#对象 RegisterClassMap()无法从类协定中识别CacheId字段。我找不到足够的关于MapIdField api的文档 有人能帮忙吗?提前谢谢 public interface ICacheable { byte[] CacheId { get; } } public class Contract : ICacheable { public
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");**
});
}
}
}
公共接口可设置
{
字节[]CacheId{get;}
}
公共类合同:iCachable
{
公共字节[]CacheId{get;set;}
公共字符串名称{get;set;}
公共字符串说明{get;set;}
}
蒙哥卡切斯托公营酒店
{
private void RegisterClass(),其中T:class,可检查
{
如果(!BsonClassMap.IsClassMapRegistered(typeof(T)))
{
BsonClassMap.RegisterClassMap();
BsonClassMap.RegisterClassMap(cm=>
{
cm.AutoMap();
**cm.MapIdField(“缓存ID”)**
});
}
}
}
以下几点对我很有用:
public class MongoCacheStore
{
public void RegisterClass<T>() where T : class, ICacheable
{
BsonClassMap.RegisterClassMap<T>(cm =>
{
cm.AutoMap();
cm.MapIdProperty("CacheId");
});
}
}
公共类Mongocastore
{
public void RegisterClass(),其中T:class,可检查
{
BsonClassMap.RegisterClassMap(cm=>
{
cm.AutoMap();
cm.MapIdProperty(“CacheId”);
});
}
}
您必须使用MapIdProperty而不是MapIdField,因为CacheId是一个属性
您的意思是在接口中没有设置访问器吗
另外,如果您安排只调用一次RegisterClass,而不是每次都测试IsClassMapRegistered,则会更好。首先,我不认为它是线程安全的(两个线程在调用IsClassMapRegistered时都可能返回false,其中一个线程在调用RegisterClassMap时会失败)。以下内容对我有效:
public class MongoCacheStore
{
public void RegisterClass<T>() where T : class, ICacheable
{
BsonClassMap.RegisterClassMap<T>(cm =>
{
cm.AutoMap();
cm.MapIdProperty("CacheId");
});
}
}
公共类Mongocastore
{
public void RegisterClass(),其中T:class,可检查
{
BsonClassMap.RegisterClassMap(cm=>
{
cm.AutoMap();
cm.MapIdProperty(“CacheId”);
});
}
}
您必须使用MapIdProperty而不是MapIdField,因为CacheId是一个属性
您的意思是在接口中没有设置访问器吗
另外,如果您安排只调用一次RegisterClass,而不是每次都测试IsClassMapRegistered,则会更好。首先,我认为它不像写的那样是线程安全的(两个线程在调用IsClassMapRegistered时都会返回false,其中一个在调用RegisterClassMap时会失败)。我还更改了cm.MapIdField(“CacheId”);至cm.MapIdField(“Id”);并将Id声明为长数据类型。但它仍然无法识别Id。因此它与无法识别字节数组Id字段无关。我还更改了cm.MapIdField(“CacheId”);至cm.MapIdField(“Id”);并将Id声明为长数据类型。但它仍然无法识别Id。因此,无法识别字节数组Id与此无关。感谢Robert的回复。是的,我的意思是在接口中没有设置访问器。我是否可以使用CacheId作为该文档的_id字段,但不序列化它。类似这样的东西
code
public class MongoCacheStore{public void RegisterClass(),其中T:class,ICacheable{BsonClassMap.RegisterClassMap(cm=>{cm.AutoMap();cm.MapIdProperty(“CacheId”);**cm.skipfromsialization(“CacheId”);}请原谅我没有缩进上面的注释,即使您要配置您的类映射,以便不序列化_id,服务器也会在插入文档时添加一个。_id字段是必填字段。感谢您回复Robert。是的,我的意思是在接口中没有设置访问器。我是否可以使用CacheId作为该文档的_id字段,但不序列化它。类似这样的东西code
public class MongoCacheStore{public void RegisterClass(),其中T:class,ICacheable{BsonClassMap.RegisterClassMap(cm=>{cm.AutoMap();cm.MapIdProperty(“CacheId”);**cm.skipfromsialization(“CacheId”);}请原谅我没有缩进上面的注释,即使您要配置您的类映射,以便不序列化_id,服务器也会在插入文档时添加一个。_id字段是必需的。