【问题标题】:Service Stack Redis in Web Api OData add EdmEntityObject / EdmEntityObjectCollectionWeb Api OData 中的服务堆栈 Redis 添加 EdmEntityObject / EdmEntityObjectCollection
【发布时间】:2015-02-20 21:20:48
【问题描述】:

我们能够将普通的 POCO 类添加到 Service Stack Redis 客户端

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缓存中就可以了

使用动态 web api 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”类型的未处理异常。

  1. 如何解决错误
  2. 如何将 EdmEntityObject / EdmEntityObjectCollection 的实例添加到 redis 缓存中

注意: 1. 不应该使用 POCO 类 2. ODataModel 本身只在运行时创建

【问题讨论】:

    标签: dynamic asp.net-web-api redis servicestack odata


    【解决方案1】:

    System.StackOverflowException 表示您正在尝试序列化具有循环依赖关系的不可序列化对象,这些对象在任何 ServiceStack 的序列化程序中都不支持(并且在大多数其他序列化程序中也会失败)。

    本质上 EF 数据模型具有循环依赖关系,这使得它们不适合序列化。相反,您应该将它们映射到可以序列化的清洁 DTO,或者使用任何 Micro ORM,例如 OrmLiteDapper,将结果集映射到干净的 POCO 模型中。

    作为目标,OrmLite 确保其所有功能(包括其Reference Support)映射到干净的断开连接的 POCO,因此它们始终是可序列化的,并且可以在服务 DTO 和其他 NoSQL 数据存储中重复使用。

    【讨论】:

    • 在我们的例子中,这些 DTO 类不可用。使用 ODataModelBuilder 在运行时为每个请求生成属性/元数据。 1、是否可以在redis缓存中添加DataTable、DataRow/DataSet? DataTable dtb = new DataTable(); RedisClient redisClient = new RedisClient(host); redisClient.Set("key", dtb); 这也会抛出StackOverflowException。 2.如何将这些对象存储在redis缓存中? 3. 手动将这些对象序列化为 JSON/XML 字符串并存储在 redis 缓存中?这是最好的方法吗?
    • @Navaneeth DataTable 出于同样的原因不可序列化。如果您知道支持它们的序列化程序,则可以将它们序列化为字符串并使用SetEntry/GetEntry API 缓存序列化的字符串。
    猜你喜欢
    • 2019-07-31
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2017-06-03
    • 1970-01-01
    • 2015-12-22
    • 2011-03-03
    • 2013-11-14
    相关资源
    最近更新 更多