2012-03-12 67 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

請問您是否包含異常消息和堆棧跟蹤? – 2012-03-12 16:48:19

回答

4

的方式在繼承層次類圖的工作是你註冊類地圖層次結構中的每個班級,每個班級地圖僅定義該類中存在的屬性。所以,你要這樣註冊的所有三類:

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

您可以將BsonIgnore屬性添加到您不希望存儲在數據庫中的類A的屬性中。只需在屬性上方添加[BsonIgnore],它將被忽略。

還有一個BsonIgnoreIfNull屬性,它只是表示它 - 如果該值爲null,則忽略該元素。在不希望數據庫中存在空值並浪費磁盤\內存的情況下非常有用。

此外,您還可以使用BsonElement屬性來更改名稱:

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