【发布时间】:2016-07-18 13:26:29
【问题描述】:
我在尝试在 RavenDB 中保存具有动态属性的对象时遇到问题
我要保存的对象代表一个订单。该订单包含一个订单行列表,因此想象以下 Order 类:
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 数据库中并检索它?
【问题讨论】:
-
为什么需要动态?是解决方案,不要使用动态
-
@Liam 问题是,我正在尝试拥有一个仍然可以包含自定义属性的通用 Orderline 对象。这是相关的,因为在未来,我希望多个产品使用相同的 API,可以将特定于应用程序的自定义属性存储在 Attributes 属性中(在本例中为颜色)