【问题标题】:How to remove circular reference from entity framework core如何从实体框架核心中删除循环引用
【发布时间】:2018-10-11 01:20:31
【问题描述】:

Web API 核心、实体框架核心

情况 - 多对多关系。 A、Join、B。Join 具有对 A 和 B 的 Id 引用。A 具有 Joins 的集合。 B 有 Join 的集合。

目标 - 得到 A 并与 B 连接 - 仅此而已。

问题 - 我得到 A 与 Joins 与 B 具有相同的单数 Join back(在一个集合中)。这发生在实体框架端。我相信 EFCore 很聪明,它会自动使用它拥有的数据为我重新输入该引用。这会很好,除非我将此作为 Json 返回给客户。 Json 序列化程序检测到循环引用,然后将其忽略(按设计)。所以我的结果是:

{ 
  // A stuff, 
  "joins": [{
    "B": {
      // B stuff, 
      "joins":[]
    }
  }]
}

我希望空连接集合为空,因此 Json 序列化程序将其删除。将集合设置为 null 不起作用。

foreach (A a in query)
{
    foreach (Join join in a.Joins)
    {
        join.B.Joins = null;
    }
}

虽然在循环期间它似乎将值设置为 null,但一旦我将其转义,引用就会再次返回。

感谢您的所有帮助!

-- 注意-- 稍后我希望能够通过与 A 的连接来获得 B。所以我无法通过停止 Joins.A 的所有序列化来解决这个问题。

【问题讨论】:

  • 这方面的问题太多了。你确定没有一个能覆盖你的吗?
  • 如何停止实体框架自动重新分配引用 - 加载后 0 个实体框架核心更改数据 - 没有任何相关的实体框架核心结果不会改变 - 0 个实体框架核心循环引用 - 引导我到这篇文章。我很高兴得到纠正,但到目前为止我还没有找到任何东西。 - 抱歉格式化,它不喜欢换行。

标签: json.net entity-framework-core


【解决方案1】:

我在追另一个问题的时候答错了。

我的印象是枚举查询会强制延迟加载运行 - 因为您实际上可以通过它查看数据。当我将查询强制到 ToList() 时,一切都按预期工作。我不明白 foreach 如何不会在未加载的查询上引发异常,或者为什么 Visual Studio 调试器允许您单步执行,查看数据,但稍后又延迟加载查询的结果,但这似乎是已经发生了。

我已经解决了两天,然后在终于在线发布后一小时我解决了它。典型的。

【讨论】:

  • 我不明白。如果你不希望它们放在首位,你是如何解决 EF Core 不附加对主要实体的引用的?序列化为 json 时遇到同样的问题。
【解决方案2】:

在 dotnet core 中使用 Entityframework 避免循环引用

public​​ void​​ ConfigureServices(IServiceCollection services) {

 ​​ ​​ ​​ ​​ ​​​​​​services.AddMvc().AddJsonOptions(opts => { ​​ 
   opts.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Serialize;
  opts.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ });

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ }

谢谢

【讨论】:

  • 这会导致我的 StackOverflowException。
  • 你的答案是另一个问题的答案老兄,你错过了。
  • 在 .netcore 3+ 中会是什么样子?
猜你喜欢
  • 1970-01-01
  • 2019-12-08
  • 2021-04-03
  • 1970-01-01
  • 2020-03-12
  • 1970-01-01
  • 2017-07-22
  • 1970-01-01
  • 2021-07-14
相关资源
最近更新 更多