2012-02-14 12 views
0

Mongo Db用の10gen C#ドライバを使用して次のコードを記述しようとしています。私がここで達成しようとしているのは、C#オブジェクトをシームレスにキャッシュするための単純なアダプタを作成することです。Mongo db C#serialization

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

答えて

3

私のために働い以下:

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

あなたはCacheIdが財産であるため、代わりにMapIdFieldのMapIdPropertyを使用する必要があります。

インターフェイスに設定されたアクセサーがないことを意味しましたか?

また、毎回IsClassMapRegisteredをテストするのではなく、RegisterClassを1回だけ呼び出すように調整すると、はるかに優れています。 1つは、スレッドセーフであるとは思えません(2つのスレッドは、IsClassMapRegisteredを呼び出すことで偽り戻ってくる可能性があり、そのうちの1つはRegisterClassMapを呼び出すときに失敗します)。

+0

Robertに返信してくれてありがとう。はい、私はインターフェイスにアクセサを設定していないことを意味しました。とにかく、そのドキュメントの_idフィールドとしてCacheIdを使用することはできますが、それをシリアル化することはできません。 ; cm.MapIdProperty(クラス、ICacheable {BsonClassMap.RegisterClassMap (CM => { cm.AutoMap():この 'code' パブリッククラスMongoCacheStore {公共ボイドRegisterClass ()Tのようなもの"CacheId"); \t ** cm.SkipFromSerialization( "CacheId"); }); } } – BlitzKrieg

+0

上記のコメントがインデントされていないことをご了承ください – BlitzKrieg

+0

RegisterClassに関する良い点。私のコードで修正されました。 – BlitzKrieg