2015-02-20 2 views
0

Мы можем добавить нормальный класс POCO к клиенту Service Stack RedisService Stack Redis в Web Api OData добавить EdmEntityObject/EdmEntityObjectCollection

IRedisTypedClient<Product> objRedisTypedClientNB = redisClient.As<Product>(); 
IRedisList<Product> objRedisListNB = objRedisTypedClientNB.Lists["Product"]; 
Product objNews = new Product(DateTime.Now.Ticks.ToString()); 
objRedisTypedClientNB.Lists["Product"].Push(objNews); 

Добавление продуктов возражают REDIS кэш прекрасно

При использовании динамический веб-апи OData v4 сервис, метаданных создается во время выполнения для каждого запроса на основе URL

Как добавить EdmEntityObject/EdmEntityObjectCollection в Redis

EdmEntityObject objEntityObject = new EdmEntityObject((EdmEntityType)objEntityType); 
objEntityObject.TrySetPropertyValue("Id", "test id"); 

IRedisTypedClient<EdmEntityObject> objRedisTypedClientEEOC = redisClient.As<EdmEntityObject>(); 
IRedisList<EdmEntityObject> objRedisListEEOC = objRedisTypedClientEEOC.Lists["EntityName"]; 

objRedisTypedClientEEOC.Lists["EntityName"].Add(objEntityObject); // throws error 

Ошибка Необработанное исключение типа «System.StackOverflowException» произошло в Unknown Module.

  1. Как устранить ошибку
  2. Как добавить экземпляры EdmEntityObject/EdmEntityObjectCollection «s в кэш REDIS

Примечание: 1. Не следует использовать классы POCO 2. ODataModel сама создается в только время выполнения

ответ

0

A System.StackOverflowException указывает, что вы пытаетесь сериализовать несериализуемые объекты с циклическими зависимостями, которые не поддерживаются ни в одном из сервисов ServiceStack's Se риализаторы (а также в большинстве других сериализаторов).

По существу EF DataModels имеют циклические зависимости, что делает их плохими кандидатами для сериализации. Вам следует вместо этого использовать карту для очистки DTO, которая может быть сериализована, или, альтернативно, использовать любой микроорганизм ORM, такой как OrmLite или Dapper, который отображает результаты в чистые модели POCO.

В цели OrmLite гарантирует, что все его функции (вкл. Его Reference Support) карты для очистки отсоединен ПОКО так они всегда сериализации и могут быть повторно использованы в других датасторов NoSQL услуги DTO-х и.

+0

В нашем случае эти классы DTO недоступны. Свойства/Метаданные создаются для каждого запроса во время выполнения с использованием ** ODataModelBuilder **. 1. Можно ли добавить DataTable, DataRow/DataSet в redis cache? 'DataTable dtb = new DataTable(); RedisClient redisClient = новый RedisClient (хост); redisClient.Set ("key", dtb); ' Это также выбрасывает ** StackOverflowException. ** 2. Как сохранить эти объекты в redis cache? 3. Ручная сериализация этих объектов в строку JSON/XML и сохранение в redis cache? Это лучший подход? – Navaneeth

+0

@Navaneeth DataTable не являются сериализуемыми по тем же причинам. Если вы знаете о поддерживающем их сериализаторе, вы можете сериализовать их в строку и кэшировать сериализованную строку с помощью API 'SetEntry/GetEntry'. – mythz

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