2016-07-18 69 views
4

我在嘗試保存在RavenDB中具有動態屬性的對象時遇到問題如何在RavenDB中存儲具有動態屬性的C#對象?

我試圖保存的對象表示一個訂單。該訂單中包含orderlines的列表,以便想象下面的順序等級:

public class Order { 
    public int Id { get; set; } 
    public List<Orderline> Orderlines { get; set; } 
} 

而且OrderLine類之中:

public class Orderline { 
    public Product Product { get; set; } 
    public int Quantity { get; set; } 
    public dynamic Attributes { get; set; } 
} 

我試圖保存對象(我會用JSON顯示它);

{ 
    "Id": 0, 
    "Orderlines": [ 
     { 
      "Product": { 
       "Id": 0, 
       "Name": "Some product" 
      }, 
      "Quantity": 1, 
      "Attributes": { 
       "color": "Red" 
      } 
     } 
    ] 
} 

保存它不拋出任何錯誤
RavenDB店訂單對象

{ 
    "Id": 0, 
    "Orderlines": [ 
     { 
      "Product": { 
       "Id": 0, 
       "Name": "Some product" 
      }, 
      "Quantity": 1, 
      "Attributes": { 
       "$type": "Newtonsoft.Json.Linq.JObject, Newtonsoft.Json", 
       "color": { 
        "$type": "Newtonsoft.Json.Linq.JValue, Newtonsoft.Json", 
        "$values": [] 
       } 
      } 
     } 
    ] 
} 

注意的Order.Orderlines[0].Attributes.color值屬性未設置...

當我嘗試將對象序列化回我的C#Order對象我得到以下異常;

無法轉換 類型的對象 'Raven.Imports.Newtonsoft.Json.Utilities.CollectionWrapper`1 [Newtonsoft.Json.Linq.JToken]' 爲類型 'Newtonsoft.Json.Linq.JValue'。

我在做什麼錯,我該如何將這個對象存儲在RavenDB數據庫中並檢索它?

+0

http://stackoverflow.com/questions/24208510/ravendb-dynamic-objects可能是相關的 – stuartd

+0

爲什麼你需要動態?是解決方案,不要使用動態 – Liam

+0

@Liam事情是,我想要一個通用的Orderline對象,仍然可以包含自定義屬性。這是相關的,因爲在未來,我希望有多個產品使用相同的API,可以將特定於應用程序的自定義屬性存儲在Attributes屬性中(在本例中爲顏色) – Bryandh

回答

2

存儲類型爲「dynamic」的動態屬性顯然是不夠的。當我將屬性屬性設置爲ExpandoObject類型時,RavenDB將常規JSON的屬性屬性存儲爲(沒有$ type和$ values,因此非常乾淨)

當從RavenDB數據庫取回時,它將反序列化回到ExpandoObject對象。

確保在嘗試在Razor視圖中顯示屬性時將ExpandoObject屬性強制轉換爲動態(例如「as dynamic」)。

2

什麼是您實際保存到屬性中的類型? 通常情況下,您將使用實際上是動態的內容,如ExpandoObject

相關問題