如何在RavenDB中存储具有动态属性的C#对象?

时间:2016-07-18 13:26:30

标签: c# ravendb

我在尝试保存RavenDB中具有动态属性的对象时遇到问题

我想保存的对象代表一个订单。订单包含订单行列表,因此请想象以下订单类:

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将Order对象存储为

{
    "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的values属性未设置...

当我尝试将对象序列化回我的C#Order对象时,我得到以下异常;

  

无法投射类型的对象   'Raven.Imports.Newtonsoft.Json.Utilities.CollectionWrapper`1 [Newtonsoft.Json.Linq.JToken]'   输入'Newtonsoft.Json.Linq.JValue'。

我做错了什么,如何将此对象存储在RavenDB数据库中并检索它?

2 个答案:

答案 0 :(得分:2)

您实际保存到属性中的类型是什么? 通常,您将使用实际上是动态的东西,例如ExpandoObject

答案 1 :(得分:2)

使用类型&#39;动态&#39;存储动态属性显然还不够。当我给Attributes属性赋予ExpandoObject类型时,RavenDB将Attributes属性存储为普通JSON(没有$ type和$ values,所以根据需要干净)

从RavenDB数据库中检索它时,它反序列化为ExpandoObject对象。

在尝试在Razor视图中显示属性时,请确保将ExpandoObject属性强制转换为动态(例如&#39;为动态&#39;)。