2016-07-18 3 views
4

У меня возникли проблемы при попытке сохранить объект с динамическим свойством в RavenDBКак хранить объекты C# с динамическими свойствами в RavenDB?

Объект, который я пытаюсь сохранить, представляет собой заказ. Порядок содержит список OrderLines так себе следующий класс Order:

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

и класс: существо строки заказа

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#. Я получаю следующее исключение;

Невозможно привести объект типа 'Raven.Imports.Newtonsoft.Json.Utilities.CollectionWrapper`1 [Newtonsoft.Json.Linq.JToken] к типу 'Newtonsoft.Json.Linq.JValue'.

Что я делаю неправильно, как я могу сохранить этот объект в базе данных RavenDB и получить его?

+0

http://stackoverflow.com/questions/24208510/ravendb-dynamic-объекты могут быть релевантными – stuartd

+0

Зачем вам нужна динамика? Является ли решение, не использовать динамику. – Liam

+0

@Liam. Дело в том, что я пытаюсь создать общий объект Orderline, который все еще может содержать пользовательские свойства. Это актуально, потому что в будущем я бы хотел, чтобы несколько продуктов использовали один и тот же API, который может хранить пользовательские атрибуты приложения в свойстве Attributes (в этом случае цвет) – Bryandh

ответ

2

Сохранение динамического свойства с типом «динамический», по-видимому, было недостаточным. Когда я присвоил свойству атрибутов тип ExpandoObject, RavenDB сохранил свойство Attributes как обычный JSON (без значений $ type и $, так что очистите их по своему усмотрению)

При извлечении из базы данных RavenDB он десериализуется обратно к объекту ExpandoObject ,

При попытке отобразить свойство в представлении «Бритва» убедитесь, что свойство ExpandoObject присвоено динамическому (например, «как динамическому»).

2

Каков тип, который вы фактически сохраняете в атрибутах? Обычно вы используете что-то, что на самом деле динамично, например ExpandoObject

Смежные вопросы