2012-03-12 5 views
0

BsonClassMapを使用していくつかのクラスのマッピングに問題があります。 私はこのような3つのクラスました:複合クラスのマッピング時にMongo db C#ドライバが例外をスローする

abstract class A { 
    public string FirstName { get; set; } 
} 

abstract class B : A{ 
    public string LastName { get; set; } 
} 

class C : B { 
    public int Age { get; set; } 
} 

を私はデータベースにマップされるクラスCのプロパティのみが表示します。

BsonClassMap.RegisterClassMap<C>(map => 
{ 
    map.MapProperty(c => c.FirstName).SetElementName("fn"); 
    map.MapProperty(c => c.LastName).SetElementName("ln"); 
    map.MapProperty(c => c.Age).SetElementName("age"); 
}); 

これは例外をスローします。これは、プロパティがCクラスに属していないためです。このような構造をどのようにマップすればよいですか?

+0

例外メッセージとスタックトレースを含めることができますか。 –

答えて

4

また、名前を変更するにはBsonElement属性を使用することができますmapは、そのクラスに存在するプロパティのみを定義します。だから、このようにすべての3つのクラスを登録したい:

var document = new C { FirstName = "John", LastName = "Doe", Age = 33 }; 
Console.WriteLine(document.ToJson()); 

出力:

BsonClassMap.RegisterClassMap<A>(map => 
{ 
    map.MapProperty(a => a.FirstName).SetElementName("fn"); 
}); 
BsonClassMap.RegisterClassMap<B>(map => 
{ 
    map.MapProperty(b => b.LastName).SetElementName("ln"); 
}); 
BsonClassMap.RegisterClassMap<C>(map => 
{ 
    map.MapProperty(c => c.Age).SetElementName("age"); 
}); 

は、次のようないくつかのコードですぐにそれをテストすることができ

{ "fn" : "John", "ln" : "Doe", "age" : 33 } 

またはあなたが使用することができます多くの場合ははるかに簡単ですが、データモデルクラスのC#ドライバに依存関係を作成する必要があります。

0

データベースに保存したくないクラスAのプロパティにBsonIgnore属性を追加できます。プロパティの上に[BsonIgnore]を追加するだけで無視されます。

また、値がnullの場合は要素を無視して、それが言うだけの意味を持つBsonIgnoreIfNull属性もあります。非常にデータベースや廃棄ディスク\メモリの値をnullにしたくない場合に便利です。クラスマップは、継承階層での作業方法は、あなたが、階層内の各クラスのクラスマップ、および各クラスを登録することである

abstract class B : A{ 
    [BsonElement("ln")] 
    public string LastName { get; set; } 
} 
class C : B { 
    [BsonElement("age")] 
    public int Age { get; set; } 
} 
関連する問題