2011-11-11 26 views
0

我正在考慮移植一個使用Mongo的小型項目,因爲它在當前場景中使用Nhibernate變得越來越耗時。MongoDb C#驅動程序支持循環引用?

我原本給了NoRM一個嘗試,並且有一個支持循環引用的分支並且工作正常,但是我找不到任何文檔來指示官方的c#驅動程序是否支持它。

情況和爲什麼我有一個循環引用是因爲我有一個位置對象,其中包含一個道路列表,每條道路都有一個鏈接到另一個位置。它與探路者中一組簡單的節點非常相似。

public class Location 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public IList<Road> Roads { get; set; } 
} 

public class Road 
{ 
    public Location From { get; set; } 
    public Location To { get; set; } 
} 

現在的問題是我有一個全世界建立這些對象(他們在真實的情景更多的屬性),它們都交鏈,但是卻無法處理循環引用我不知道怎麼樣我可以解決這個問題,因爲每條道路都需要知道起點和終點。

我知道一個妥協就是擺脫位置對象,而是有一個引用位置的Id,但我必須分別查詢每個子位置。這隻會執行一次,然後保存在內存中,因爲有一個巨大的地圖包含所有可能的位置和所有可能的路線,因此可以在點之間找到快速路徑。

這可能是位置的情況和道路不適合文檔存儲方法,並可以存儲另一種方式......

回答

1

官方的C#司機真的不支持在所有「引用」。字段的值可以是一個ObjectID,但聯接或引用的概念在官方的C#驅動程序中並未真正實現。

當然,即使有「參考」支持,這些驅動程序仍然會執行多個查詢。

這可能是位置的情況和道路不適合文檔存儲方法,並可以存儲另一種方式......

鑑於你描述的情況,我會建議看圖形數據庫。有幾個流行的包括Neo4J,微軟的Trinity,sones的GraphDB和其他主機。

+0

感謝您的信息。它會執行服務器上的多個驅動程序,但只是返回聚合結果,或者實際發出單個查詢?我認爲這可能是前者,但沒有任何事實證據表明這一說法。其餘的對象不是循環的,似乎完全適合文檔存儲的理想,但是因爲初始映射的這種情況不是它可能最終成爲交易斷路器,或者如前所述,我只是將這個位關係存儲起來,其他位文件爲基礎 – Grofit

+0

它必須是客戶端,因爲沒有服務器端「加入」命令。看看圖形數據庫,據我所知他們支持不同的底層存儲,所以你可能會得到你需要的所有東西。 –