如何从实体框架核心

时间:2018-01-11 14:48:31

标签: json.net entity-framework-core

Web Api核心,实体框架核心

情况 - 多对多关系。 A,Join,B。Join有Id引用A和B.A有Joins的集合。 B有联合收藏。

目标 - 使用B加入A - 而且不再进一步。

问题 - 我得到A与B的联接与相同的单一加入回(在集合中)。这发生在实体框架端。我相信EFCore很聪明,并且会根据它拥有的数据自动将该引用反馈给我。这将是不错的,除了我将此作为Json返回给客户端。 Json序列化程序检测到循环引用,然后省略它(按设计)。所以我的结果是:



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




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

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

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

感谢您的帮助!

- 注意 - 后来我希望能够用A加入B,所以我无法通过停止Joins.A的所有序列化来解决这个问题。

2 个答案:

答案 0 :(得分:0)

我在追逐另一个问题时错误地回答了这个问题。

我的印象是,枚举查询会强制延迟加载运行 - 因为您实际上可以通过它查看数据。当我强迫我的查询进入ToList()时,一切都按预期工作。我不明白foreach如何不在卸载的查询上抛出异常,或者为什么visual studio调试器允许您单步执行,查看数据,但之后懒惰加载查询的结果,但这似乎是发生了。

我已经在这两天了,然后终于在网上发帖后一小时我就解决了。典型

答案 1 :(得分:0)

要避免在dotnet核心中使用Entityframework进行循环引用

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

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

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

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

谢谢