Asp.Net Web API 2.0,从Get()动作方法中获取复杂对象返回。
Asp.Net Web API 2.0,从Get()动作方法中获取复杂对象返回。
我有两个模型类ServiceProvider.cs和Club.cs,一个服务提供商可以有多个俱乐部。然而,ServiceProvider.cs中有一个虚拟的俱乐部集合。如下所示:
public class ServiceProvider
{
public int ServiceProviderId { get; set; }
public string Name { get; set; }
public string Address { get; set; }
public string PhoneNo { get; set; }
public virtual ICollection
}
public class Club
{
public int ClubId { get; set; }
public string Name { get; set; }
public string Address { get; set; }
public virtual ServiceProvider serviceProvider { get; set; }
public int ServiceProviderId { get; set; }
}
我已经实现了仓储模式来查询MS Sql服务器,如果我返回我的仓储的_serviceProvider的GetAll()方法,它工作正常,我在PostMan中得到了所有的服务提供商对象。
public IEnumerable
{
return _serviceProvider.GetAll();
}
但是,如果我返回仓储的GetAllWithClubs()方法,我在这里得到了运行时异常。问题是:我无法获取所有的服务提供商及其俱乐部集合。但是,在在此之前我已经调试过我的代码,我得到了所有的服务提供商和他们的俱乐部集合。我确定从数据库获取数据是正确的,问题出现在从Get()操作方法返回响应的地方。
public IEnumerable
{
return _serviceProvider.GetAllWithClubs();
}
Postman中出现的错误是
[错误图像链接]
Visual Studio中的输出是
[输出图像链接]
我已经尝试过在GetAllWithClubs()方法前面使用.toList(),并返回ActionResult,这是Asp.net core 2.1中的新功能(在我的情况下不支持2.0)。我相信这不是一个重复的问题。
GetAll()和GetAllWithClubs()方法的实现如下。
public IEnumerable
{
return _context.ServiceProviders
.Include(c => c.Clubs);
}
在Repository.cs中
public IEnumerable
{
return _context.Set
}
问题:上述代码中的问题是Json.net自引用循环检测,解决方案是忽略循环引用并不进行序列化。在Asp.Net MVC 2.0中,我们需要在Startup.cs
中添加以下代码:
services.AddMvc().AddJsonOptions( options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore);
重新构建,问题解决。
更好的方法是创建一个视图模型并用所需的数据填充它,不要将领域模型暴露给外部世界。
在这种情况下,我们仍然需要忽略循环引用吗?
这取决于数据的形状,但是你可以扁平化数据或者使关系单向来消除循环引用。