我在尝试保存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数据库中并检索它?
答案 0 :(得分:2)
您实际保存到属性中的类型是什么? 通常,您将使用实际上是动态的东西,例如ExpandoObject
答案 1 :(得分:2)
使用类型&#39;动态&#39;存储动态属性显然还不够。当我给Attributes属性赋予ExpandoObject类型时,RavenDB将Attributes属性存储为普通JSON(没有$ type和$ values,所以根据需要干净)
从RavenDB数据库中检索它时,它反序列化为ExpandoObject对象。
在尝试在Razor视图中显示属性时,请确保将ExpandoObject属性强制转换为动态(例如&#39;为动态&#39;)。