2015-01-21 39 views
0

我有一個相對複雜的基於Contracts(Interfaces)的實體模型,並且正在尋找關於使用Neo4j存儲實體的最佳方式的想法。有沒有人試圖做到這一點?支持具有接口的複雜對象

示例模型。這個想法是支持存儲包含IAddress的用戶對象。

public interface IAddress { 
    string Line1 { get; set; } 
    string Line2 { get; set; } 
} 

public interface IUser { 
    string Name { get; set; } 
    IAddress Address { get; set; } 
} 

public Address : IAddress { 
    public string Line1 { get; set; } 
    public string Line2 { get; set; } 
} 

public class User : IUser { 
    public User() { 
     Address = new Address(); 
    } 

    public string Name { get; set; } 
    public IAddress Address { get; set; } 
} 
+0

所以我對'neo4jclient'完全沒有任何經驗,事情可能會比你的例子更深入,但是從你上面顯示的內容來看,你不希望將'Address'作爲一個單獨的節點存儲給用戶? – JohnMark13 2015-01-21 12:16:29

回答

0

的問題是,你不能複雜類型存儲到Neo4j的,它只是不接受他們 - 無論你使用的接口或只是類(我想你得到CypherTypeException如果你嘗試把它存儲在數據庫中)。

要解決這個問題,最好的途徑遇到是使用自定義的串行器(用於其Neo4jClient是完全能夠使用的),作爲這個問題的答案:Can Neo4j Store a Dictionary in a Node

顯然在你的情況下,用你的類型替換Dictionary。如果你需要,你可以製作一個更通用的版本來覆蓋多種類型。

+0

爲什麼不將這些「複雜類型」映射到關係上工作?如果你仔細想想,我們有幾個關鍵實體(在這個例子中是用戶和地址)。 上面的例子使用關係類/概念的具體類型正常工作。我的問題是支持類似IoC容器的東西,以便在從數據庫加載具體對象時解析接口。 從審查庫看來,這看起來都是由Json.NET庫處理的,它實際上有一個依賴解析器機制。有沒有人試過使用它? – Shawn 2015-02-01 16:01:23

+0

我在考慮你對「複雜類型」的回答,我不確定我是否同意所有複雜的「屬性」都應該是關係的概念。在一天結束時,整個「節點」應該是可以序列化和存儲的東西。 儘管可以完成地址的創建節點,但我會問這個問題 - 爲什麼開發人員被迫創建節點和關係。如果我從不打算直接查詢Address類的屬性而不依賴於主用戶,那麼爲什麼不直接存儲它 - 畢竟它只是一個序列化的字符串,當它被存儲時。 – Shawn 2015-02-02 02:50:47

+0

Erm,這不是我的答案所說的 - 我的答案爲您提供了一種序列化節點並將其存儲的方法,我沒有提及改變您的結構。在我的回覆中,我建議添加一個自定義序列化程序,該程序使用JSON.NET進行序列化。 – 2015-02-02 11:04:30