2017-04-09 8 views
0

私は基本的には、オブジェクト/文書の複数の種類が保存されますが、それらのすべてが基本インターフェイスから継承したコレクションが...しかし、私はロードするときに、この例外を取得しておくのですたい:不明な弁別値にMongoDB

Additional information: An error occurred while deserializing the Inventory property of class Character: Unknown discriminator value 'TestItem'.

私のコードは次のとおりです。

public class Character 
{ 
    ... 
    public List<IInventoryItem> Inventory { get; set; } 
    ... 
} 

public interface IInventoryItem 
{ 
... 
} 

class TestItem : IInventoryItem 
{ 
... 
} 

ヘルプは大歓迎です。

答えて

2

問題は多態型を明示的にMongoDBドライバに宣言していないことです。

これには、属性を使用する方法とマッピング設定方法の2つのオプションがあります。詳細:属性を使用してhttp://mongodb.github.io/mongo-csharp-driver/2.2/reference/bson/mapping/

:ポリモーフィック型(例えばインターフェース)を表す文書が特別でDBに保存されます:WHY

BsonClassMap.RegisterClassMap<TestItem>(); // do it before you access DB 

[BsonDiscriminator("TestItem")] 
public class TestItem : IInventoryItem 
{ 
    ... 
} 

マッピング設定方法を使用してフィールドには、弁別子の値を含む_tという名前のフィールドがあります。あなたのケースでは、Character文書は次のようになります。書き込みで

{ 
    // ... other fields 
    Inventory: [ 
     { 
      _t: "TestItem", 
      //... other fields 
     }, 
     { 
      _t: "TestItem", 
      //... other fields 
     } 
    ] 
    // ... other fields 
} 

を、マッピングが存在しない場合、彼らはその場で作成され、そしてTestItem弁別がTestItemクラスにマッピングされています。その瞬間から、AppDomainの人生のためのマッピングが存在します。したがって、たとえば、書き込み後に読み取りを実行すると、問題はありません。

しかし、データを最初に読み取ると、BSONシリアライザはTestItem識別子のマッピング先を知りません。したがって、常に識別子のマッピングを明示的に指定することをお勧めします。このようにして、ディスクリミネータの値を制御することもできます。デフォルトでは、ディスクリミネータの値はタイプ名と同じです。

+0

助けてくれてありがとうございますが、何らかの理由で同じエラーが発生しています。 – Ahmad45123

+0

実際には2番目の方法が働いていました。属性がなぜそうでなかったのか、私はそれを使用したいと思います。 – Ahmad45123

+0

MongoDB C#のどのバージョンをお使いですか? –

関連する問題