2012-02-14 91 views
0

我試圖用Mongo Db的10gen C#驅動編寫下面的代碼。我想在這裏實現的是編寫一個簡單的適配器,以無縫地緩存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

我也改變了cm.MapIdField(「CacheId」);到cm.MapIdField(「Id」);並將Id聲明爲長數據類型。但它仍然無法識別Id。所以這是不相關的無法確定字節數組ID字段 – BlitzKrieg 2012-02-14 18:51:22

回答

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時會失敗)。

+0

感謝您的答覆羅伯特。是的,我打算在界面中沒有設置存取器。無論如何,我可以使用CacheId作爲該文檔的_id字段,但不能序列化它。像這樣'code' 公共類MongoCacheStore { 公共無效的RegisterClass ()其中,T:類,ICacheable { BsonClassMap.RegisterClassMap (釐米=> { cm.AutoMap(); cm.MapIdProperty( 「CacheId」); \t ** cm.SkipFromSerialization(「CacheId」); }); } } – BlitzKrieg 2012-02-15 23:13:23

+0

對於缺少縮進,請諒解以上評論 – BlitzKrieg 2012-02-15 23:18:42

+0

關於RegisterClass的好處。整理在我的代碼中。 – BlitzKrieg 2012-02-15 23:19:40