【问题标题】:Storing a JSON string in SQL Server and returning with ASP.NET Web API and Entity Framework在 SQL Server 中存储 JSON 字符串并使用 ASP.NET Web API 和实体框架返回
【发布时间】:2013-08-14 21:26:58
【问题描述】:

我有一个 SQL Server (2012) 数据库架构,它有点类似于购物网站或社交网站的数据库架构,其中有多个“项目”,每个项目都有多个图像,尽管对于每个图像我存储了大约 10 个不同的大小那个图像。

我的计划是有一个表来保存所有图像数据,每个原始图像一行。列名:

ImageID
PostID (foreign key)
OriginalImageWidth
OriginalImageHeight
OriginalImageFileUrl
ImageSizesJSON (nvarchar(MAX))

最后一列ImageSizesJSON 将存储一个 JSON 对象数组,表示该项目的各种(上传时自动调整大小)调整大小的图像。比如像:

[{ "height": 1536, "width": 2048, "source": "images/post/1/2048x1536.jpg" },
{ "height": 960, "width": 720, "source": "images/post/1/960x720.jpg" },
{ "height": 720, "width": 540, "source": "images/post/1/720x540.jpg" }]

这尤其是为了避免以下所有情况:

  1. 过多的数据库调用/表连接(因为不需要查询各种大小) - 即。将原始图像的数据库非规范化为图像大小数据
  2. 不必要地读取所有图像大小的文件系统,以及 (元)数据存储位置(数据库和文件系统)的相关断开连接
  3. 处理各种图像大小的不必要的应用程序代码(处理所有图像大小所需的所有操作都可以在上传和批处理脚本中完成(包括将图像大小数组序列化为 JSON 并将其保存到数据库) )。

我正在使用 .NET (4.5)、Entity Framework(我认为是最新的 - 5.0(编号令人困惑))和 Web API 将 JSON AJAX Web 服务返回到我的基于 Web 的移动应用程序。

但是,在我的 POCO 序列化之后/期间,我在将 SQL Server 列“ImageSizesJSON”返回的 JSON 与 Web API 输出的 JSON 相结合时遇到问题。

我尝试了各种方法来组合它们,但每种方法都有我无法克服的问题,我也不确定哪种方法是最好的:

  1. 只需将该列视为 CLR string。这种方法的问题是,当webservice返回JSON时,JSON被视为(如预期的那样)一个字符串,并且双引号被转义,整个JSON都有引号等,我找不到一种将其输出为纯 JSON 的方法,并且不确定是否有任何其他方法可以绕过它的输出方式。也许这可以在 JavaScript 中适当处理..?
  2. 将 JSON 序列化回 POCO 对象,然后将其“附加”到我的 LINQ to EF 查询以获取 Web API,然后重新序列化以输出为 JSON(尽管我意识到这是不必要的双重开销)。当我尝试执行此操作时,在 LINQ to EF 查询中附加序列化 JSON 时出现各种错误,例如“此方法无法转换为存储表达式”或“无法创建仅原始类型或枚举类型的常量值”在这种情况下支持类型。我理解为什么会发生这些错误,但我也不确定如何(优雅地)绕过它们。

经过大量谷歌搜索后,我现在几乎要放弃非规范化的图像大小表模式,只是为了在这一点上取得进展,但是这种方法对我来说似乎是最好的应用程序架构,我想知道如何去做(另外我认为其他人也会觉得它很方便),所以我非常感谢指向解决方案的指针或理想的代码来处理我提到的任何一个问题。

感谢您的任何意见。

【问题讨论】:

    标签: asp.net sql-server json entity-framework asp.net-web-api


    【解决方案1】:

    我找到了问题的答案,使用选项 #1(将保存 JSON 字符串的列视为 .NET string 类型)。在调用 Web API 网络服务的 JavaScript/AJAX 中,我需要做的就是使用 JSON.parse() 引用 ImageSizesJSON 列,例如:

    var imagesJson = JSON.parse(ImageSizesJSON);
    

    这会将 JSON 的转义字符串转换为 JSON 对象,以便它可以作为 JavaScript 中的对象正确使用。

    【讨论】:

      猜你喜欢
      • 2013-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多