使用显式 Include 时,即使在 ProxyCreation false 之后,也会出现 JSON 序列化实体框架自引用循环错误

2024-04-02

JSON 序列化(ASP.Net Web API)由于自引用循环而失败(这是一个常见问题,原因:被请求的实体延迟加载子实体,并且每个子实体都有对父实体的反向引用)。

我找到了解决办法,但对我没有帮助:

  1. 使用 [JsonIgnore] 来忽略导航属性: https://stackoverflow.com/questions/5769200/serialize-one-to-many-relationships-in-json-net/10306177#10306177该解决方案有效,但不适用于我的情况。例如:要获取客户信息及其订单,我会快速将 [JsonIgnore] 添加到 Order 类中的 Customer 属性,但是当我想要获取订单信息以及客户详细信息时,因为 Customer 属性上有 [JsonIgnore] ,它不会包含客户详细信息。
  2. 更改 JSON.Net 序列化器设置以保留引用 https://stackoverflow.com/a/10092472: 无法保留,因为我不需要循环引用数据。
  3. 在数据上下文中禁用代理创建并使用显式加载(这应该可以理想地解决问题) https://stackoverflow.com/a/5588725: 禁用代理创建会停止延迟加载并返回数据而不会出现错误,但是当我明确包含子实体时,我再次遇到意外的自引用循环错误!该错误位于父实体的反向引用级别。

有类似的经历/建议吗?


我尝试了所有建议的解决方案,但没有成功。最终将 JSON.Net Serializer 的 DefaultContractResolver 重写为:

public class FilterContractResolver : DefaultContractResolver
{
    Dictionary<Type, List<string>> _propertiesToIgnore;

    public FilterContractResolver(Dictionary<Type, List<string>> propertiesToIgnore)
    {
        _propertiesToIgnore = propertiesToIgnore;
    }

    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
    {
        var property = base.CreateProperty(member, memberSerialization);
        List<string> toIgnore;
        property.Ignored |= ((_propertiesToIgnore.TryGetValue(member.DeclaringType, out toIgnore) || _propertiesToIgnore.TryGetValue(member.DeclaringType.BaseType, out toIgnore)) && toIgnore.Contains(property.PropertyName));
        return property;
    }
}

然后创建一个静态类,它根据控制器返回要忽略的属性字典:

public static class CriteriaDefination
{
    private static Dictionary<string, Dictionary<Type, List<string>>> ToIgnore = new Dictionary<string, Dictionary<Type, List<string>>>
    {
        {
            "tblCustomer", new Dictionary<Type, List<string>>{
                {
                    typeof(tblCustomer), new List<string>{
                        //include all
                    }
                },
                {
                    typeof(tblOrder), new List<string>{
                        "tblCustomer"//ignore back reference to tblCustomer
                    }
                }
            }
        },
        {
            "tblOrder", new Dictionary<Type, List<string>>{
                {
                    typeof(tblCustomer), new List<string>{
                        "tblOrders"//ignore back reference to tblOrders
                    }
                },
                {
                    typeof(tblOrder), new List<string>{
                        //include all
                    }
                }
            }
        }
    };
    public static Dictionary<Type, List<string>> IgnoreList(string key)
    {
        return ToIgnore[key];
    }
}

在每个控制器内部更改 JSON Formatter,如下所示:

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new FilterContractResolver(CriteriaDefination.IgnoreList("tblCustomer"));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用显式 Include 时,即使在 ProxyCreation false 之后,也会出现 JSON 序列化实体框架自引用循环错误 的相关文章

  • JSON.NET、XmlSerializer 和“指定”属性

    我有一个 REST 服务 它接受 JSON 和 XML 作为输入 并使用反序列化内容对外部服务进行 SOAP 调用 用于反序列化的类是从 SOAP 服务的 wsdl 自动生成的 我在 XML 请求的情况下使用 XmlSerializer 并
  • 实体框架按枚举值按字母顺序排序

    我有一个名为Comment 其中有一个enum类型的属性CommentType public class Comment public virtual Guid Id get private set public virtual Comme
  • 为什么实体框架尝试选择所有列,即使我只指定了两列?

    我继承了一个 ASP MVC 项目 该项目使用 Entity Framework 6 1 3 与 Dynamics CRM 2011 SQL 数据库进行交互 我正在使用此查询来尝试获取具有帐号的所有活动帐户 并且我仅选择两列为匿名类型 va
  • EF6 找不到 LocalDBConnectionFactory

    我有 2 个项目 类库 作为 DAL 层 和 ASP NET MVC 项目 作为 UI 为了获取数据 我尝试使用 EF6 但它不起作用 所有异常文本 EntityFramework dll 中发生 System InvalidOperati
  • 如何使实体框架存储过程异步?

    我有一个函数 ReturnStatementDetailsForSubRepAsync 它使用一个 linq 表达式 我可以使用内置函数轻松地使其异步 例如 ToListAsync 现在 因为此 LINQ 函数是异步的 所以我必须使父函数异
  • 如何跟踪长时间运行的 IIS 调用?

    我们的用户焦躁不安 他们不断抱怨一些模糊的 无法衡量的东西 特别是缓慢 但没有给出具体细节 这当然使得追踪变得非常困难 尽管如此 他们很可能是对的 有些服务器调用需要很长时间才能返回 所以我想在网站上放置某种嗅探器 我们在 IIS7 上使用
  • 使用 linq-to-entities 将字符串转换为日期时间的大问题

    如何使用 linq toEntity 将字符串转换为日期时间 我收到以下查询 其中visit date列数据类型是字符串 var memberl from v in abc visits join m in abc members on v
  • 当 edmx 文件位于单独的项目中时出错

    我有问题说 在配置中找不到指定的命名连接 或者不打算与EntityClient提供者 或无效 我的 edmx 文件位于单独的项目中 但该项目的连接字符串app config 什么可能导致问题 确保 app config 位于设置为启动项目的
  • 对于相同的数据库对象,实体框架对象引用是否相同

    如果我从不同位置查询 逻辑上 在数据库中 相同的对象 实体框架是否返回相同的对象引用 例如 我查询了名为 Joe Black 的客户 并假设现在我知道数据库中只有一个 Joe Black Customer c select blabla w
  • MVC 5 动态行与 BeginCollectionItem

    单击按钮时向表添加 删除行的最佳方法是什么 我需要从子类属性创建的行 子类是主类 模型中的列表 当前有一个视图 模型是 MyMain 它使用 RenderPartial 引用部分视图 分部视图显示模型的属性 一个名为 MyChild 的类
  • ASP.NET MVC 控制器无法使用流内容正确返回 HttpResponseMessage

    正如标题所示 我没有让 MVC 控制器正确返回 HttpResponseMessage HttpGet AllowAnonymous public HttpResponseMessage GetDataAsJsonStream object
  • VS 2012 中缺少实体数据模型

    添加新项目时 我在 数据 选项卡下找不到实体数据模型 我查看了几个问题和答案以及有关此问题的信息 但没有一个解决方案有效 我已修复 卸载并重新安装 手动安装 EF Tools 包并尝试卸载所有 VS 相关程序 我还尝试在不同的 NET 框架
  • MVC 4 授权属性无法识别 ASP.Net 3.5 中的表单身份验证

    我正在为之前创建过 ASP Net 3 5 VS 2008 应用程序的客户端创建一个新的 MVC 4 应用程序 我创建了一个网关应用程序来启动其他几个 ASP Net 3 5 Web 应用程序 网关应用程序处理登录和表单身份验证票证 只要所
  • 如何检查 Json 数组是否包含特定值?

    如何检查 Json 数组是否包含特定值 这是我加载数据的代码 dynamic d JObject Parse number 1000 str string array 1 2 3 4 5 6 Console WriteLine d numb
  • 在 IIS 6 虚拟目录中运行的 ASP.Net MVC 4 应用程序上目录列表被拒绝

    我试图让 ASP Net MVC 4 在 IIS6 上工作 但遇到了总是有趣的 目录列表被拒绝 错误 在您开始发布有关无扩展名网址以及我需要如何阅读 Haacked 博客文章之前 我已经 因此 这里的设置是 我创建了一个新网站并将其配置为使
  • .NET 实体框架核心

    我已经阅读了过去两年中发布的几乎所有有关 EF 的其他问题 我下载其他软件包没有任何问题 只是实体框架不会为我安装 我什至尝试安装最新版本的 Nuget 并在我的项目目录中使用它的工具来恢复包 之后 我将这一行添加到我的 csproj 中
  • 将大量实体插入 SQL Server 2012 [重复]

    这个问题在这里已经有答案了 我正在进行一个使用 Entity Framework 5 和 SQL Server 2012 的项目 我们需要一次插入大量行 100k 个实体的顺序 基本上 我们有一个物理程序 它输出大量二进制数据 然后我们需要
  • 如何使用 ASP.NET MVC 在 Kendo UI Grid 中实现 N 级嵌套层次结构

    我正在尝试使用 ASP NET MVC 在 Kendo UI Grid 中实现 N 级嵌套层次结构 我可以实现特定数量的嵌套网格 但如何在 asp net MVC 中使用特定数据实现 N 级嵌套网格 Html Kendo Grid
  • 在 ASP.NET MVC 4 中使用 jQuery Mobile 1.3 面板时的双滚动条

    我无法弄清楚这一点 将以下代码放入布局页面并在浏览器中查看后 我将显示 2 个垂直滚动条 div div 遇到了类似的问题 并注意到只有在使用我的自定义主题时才出现这种问题 我以错误的顺序将自定义主题添加到页面 这导致了问题 正确的顺序是
  • 带有自定义鉴别器的 EntityFramework Code First 继承

    我正在尝试在 EntityFramework Code First 中映射以下继承 public class Member public string ProjectName get set public string AssemblyNa

随机推荐