【问题标题】:How to store C# objects with dynamic properties in RavenDB?如何在 RavenDB 中存储具有动态属性的 C# 对象?
【发布时间】: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 属性中(在本例中为颜色)

标签: c# ravendb


【解决方案1】:

您实际保存到属性中的类型是什么? 通常你会使用一些真正动态的东西,比如 ExpandoObject

【讨论】:

    【解决方案2】:

    存储具有“动态”类型的动态属性显然是不够的。当我为 Attributes 属性赋予 ExpandoObject 类型时,RavenDB 将 Attributes 属性存储为普通 JSON(没有 $type 和 $values,因此可以根据需要进行清理)

    当从 RavenDB 数据库取回它时,它会反序列化回一个 ExpandoObject 对象。

    在尝试在 Razor 视图中显示属性时,确保将 ExpandoObject 属性转换为动态(例如“作为动态”)。

    【讨论】:

      猜你喜欢
      • 2014-02-20
      • 1970-01-01
      • 2012-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多