2013-12-10 4 views
12

C#のMongoRepositoryと継承を組み合わせると、シリアライゼーションエラーが発生します。MongoRepository継承シリアライゼーションエラー

本当に奇妙なことは、短時間で動作しますが、再構築や何かが失敗した後です。コレクションを削除して新しいコレクションを作成すると、コレクションが停止または再構築されるまで機能します。私はそれが好きで取得しようとすると

public class Organization 
{ 
     // other attributes removed for demonstration simplicity 

     public List<Person> People { get;set; } 
} 

public abstract class Person 
{ 
     public string Id {get;set;} 
     public string Name {get;set;} 
} 

public class Employee : Person 
{ 
     public string Badge {get;set;} 
} 

public class Contractor : Person 
{ 
    public string Company {get;set;} 
} 

私のコードは次のようになり

static MongoRepository<Organization> apps = new MongoRepository<Organization>(); 
return apps.Single(c => c.Id == id); 

私が受け取るエラーは、次のとおりです。

タイプ「システムの例外。 IO.FileFormatException 'はMongoDB.Driver.dllで発生しましたが、ユーザーコードで処理されませんでした

追加情報:API.Models.OrganizationクラスのPeopleプロパティを逆シリアル化する際にエラーが発生しました。抽象クラスのインスタンスを作成できません。

答えて

14

デコレータを追加すると、属性:クラスへ

[BsonKnownTypes(typeof(Contractor), typeof(Employee))] 

は、問題を解決しました。

+2

ポリモーフィッククラスの操作とセリライジング/デシリアライズの詳細は、http://docs.mongodb.org/ecosystem/tutorial/serialize-documents-with-the-csharp-driver/#polymorphic-classes-andにあります。 - 識別器 –

2

Personが別の抽象クラスを継承する同様の問題を抱えていた。逆シリアル化の例外があるため発生したことを

BsonClassMap.RegisterClassMap<Person>(cm => { 
    cm.SetIsRootClass(true); 
}); 

注:私はMongoのが私のドメインモデルにし、それを少しいじった後、属性置くのアイデアを嫌って、ルートは、それがシリアライズし、適切にデシリアライズ可能としてPersonクラスをマーキング判明MongoDBドライバがディスクリミネータ_tフィールドを設定していませんでした。