2012-11-22 35 views
0

這是我在Mongo(和一般的NoSQL)開始的幾天,所以我可能會嘗試一些只能在我腦海中可能的事情。類型繼承的MongoDB集合錯誤(FileFormatException)

設置:

DB:MongoDB的2.2.1

接口:從的NuGet

最新10gen的C#驅動程序我有一個通用類這樣

public class User { public string userName {get;set;} } 

然後像這樣的應用程序特定實現

public class App1User : User { public int appSpecificProperty { get;set; } } 

問題:

在我的應用程序可以加載保存爲類型用戶的用戶或App1User的記錄。不幸的是,一旦我使用App1User類型保存記錄,我不能再以用戶的身份加載它(FileFormatException:Element'appSpecificProperty'與類User的任何字段或屬性不匹配)。

我加載項是這樣的:

var collection = mongDB.GetCollection<User>("users"); 
var query = new QueryDocument("username" : userName); 
var user = collection.Find(query).SingleOrDefault(); // error here if record was type App1User 

這是一個問題,因爲我想用在多個項目的用戶認證庫,然後就擴展用戶對象添加應用程序特定設置。

回答

0

我發現,你需要與此屬性

[BsonDiscriminator("baseuser", RootClass = true)] 

不幸的是,這隻會解決新記錄,以紀念你的父類,我還沒有想出如何此修復程序適用於不能加載現有的記錄。

+0

如果您知道要在文檔中更新什麼,應該可以從mongo [interactive shell]運行更新查詢(http://www.mongodb.org/display/DOCS/mongo+-+The+Interactive+殼牌)到所有有問題的記錄。 – Eric

+0

我有同樣的事情,並且我爲所有類設置了[BsonDiscriminator],並且我還設置了root根目錄,但我仍然厭倦了這樣的事情,並且出現錯誤:「'FirstName'與任何字段不匹配或'IEnumerable'中的'RealEstate.Models.Owner'屬性的屬性' all = _db.GetCollection (_tableName).FindAll(); var list = all.ToList(); return list;'我開始基於我很久以前從未完成的事情來構建我的項目,我在NHibernate中以繼承層次結構的形式創建了這些模型,但現在我不確定mongo是否支持,或者我應該如何調用/存儲他們 – deadManN

+0

讓我補充說,他自己沒有用的所有者,我存儲一個類型的人,或從所有者繼承的機構的模型。 – deadManN