如何在.Net Core Web API中停止自引用循环?

Sai*_*udo 15 c# entity-framework-core asp.net-core-webapi

我有一些问题,我猜这些问题与使用.NET Core Web API和Entity Framework Core进行自引用有关.我添加时,我的Web API开始窒息.包括一些导航属性.

我发现旧的Web API中似乎是一个解决方案,但我不知道如何为.NET Core Web API实现相同的功能(我还处于早期学习阶段).

较旧的解决方案是将其粘贴在Global.asax的Application_Start()中:

 GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Serialize;
Run Code Online (Sandbox Code Playgroud)

我怀疑这是在StartUp的ConfigureService()方法中处理的,但除此之外我不太了解.

或者有更合适的方法来处理这个问题吗?

Sai*_*udo 40

好的......我终于在此找到了一些参考资料.解决方案是:

public void ConfigureServices(IServiceCollection services)
{
    ...

    services.AddMvc()
        .AddJsonOptions(
            options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
        );

    ...
}
Run Code Online (Sandbox Code Playgroud)

我从这里得到了这个

  • 这在 .NetCore 3 中已更改。请参阅[此](/sf/ask/3896677851/) awnser。也许您可以将其添加到您的答案中。 (2认同)

Rob*_*rry 5

ReferenceLoopHandling。忽略“隐藏”问题,而不是解决问题。您真正需要做的是构建图层。创建域对象以使其位于您的实体之上,并将它们包装在某种服务/业务层中。查找存储库模式,并在有帮助的情况下应用它。您需要在实体和域对象之间进行映射,这使您有机会适合某种映射器(自动映射器)和验证层。

如果您的域对象和实体完全相同,那么您需要更多地考虑您的工作。

例如:您的实体是否具有软删除?(已删除)标志?如果是这样,则不必一定要通过Web返回到客户端,因此这是一个不同之处的完美示例。

无论哪种方式,答案都不是在JSON中覆盖它,而是改变您的体系结构。


小智 5

如果您使用的是ASP.NET Core 3.0,请遇到此问题,请安装NuGET软件包:Microsoft.AspNetCore.Mvc.NewtonsoftJson 3.0.0

要替换尚未具有引用循环处理的新System.Text.Json,请在Startup.cs中执行此操作,请确保在ConfigureServices中包含以下内容:

如果使用最新的.Net Core 3.0方法:

services.AddControllers().AddNewtonsoftJson(options =>
{
    options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
});
Run Code Online (Sandbox Code Playgroud)

还是旧方法:

services.AddMvc(option => option.EnableEndpointRouting = false)
       .AddNewtonsoftJson(options => 
                 options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore)
       .SetCompatibilityVersion(CompatibilityVersion.Version_3_0);
Run Code Online (Sandbox Code Playgroud)