Mongo db C#序列化

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

我试图使用Mongo Db的10gen C#驱动程序编写以下代码。我在这里试图实现的是编写一个简单的适配器,以便无缝地缓存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");**
            });
        }
    }
}
公共接口可设置
{
字节[]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字段是必需的。