Asp.Net Web API 2.0,从Get()动作方法中获取复杂对象返回。

18 浏览
0 Comments

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 Clubs { get; set; }

}

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 Get()

{

return _serviceProvider.GetAll();

}

但是,如果我返回仓储的GetAllWithClubs()方法,我在这里得到了运行时异常。问题是:我无法获取所有的服务提供商及其俱乐部集合。但是,在在此之前我已经调试过我的代码,我得到了所有的服务提供商和他们的俱乐部集合。我确定从数据库获取数据是正确的,问题出现在从Get()操作方法返回响应的地方。

public IEnumerable Get()

{

return _serviceProvider.GetAllWithClubs();

}

Postman中出现的错误是

[错误图像链接]

Visual Studio中的输出是

[输出图像链接]

我已经尝试过在GetAllWithClubs()方法前面使用.toList(),并返回ActionResult,这是Asp.net core 2.1中的新功能(在我的情况下不支持2.0)。我相信这不是一个重复的问题。

GetAll()和GetAllWithClubs()方法的实现如下。

public IEnumerable GetAllWithClubs()

{

return _context.ServiceProviders

.Include(c => c.Clubs);

}

在Repository.cs中

public IEnumerable GetAll()

{

return _context.Set();

}

0
0 Comments

问题:上述代码中的问题是Json.net自引用循环检测,解决方案是忽略循环引用并不进行序列化。在Asp.Net MVC 2.0中,我们需要在Startup.cs中添加以下代码:

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

重新构建,问题解决。

更好的方法是创建一个视图模型并用所需的数据填充它,不要将领域模型暴露给外部世界。

在这种情况下,我们仍然需要忽略循环引用吗?

这取决于数据的形状,但是你可以扁平化数据或者使关系单向来消除循环引用。

0