我使用ASP.NET Core从我的数据库获得服务器响应有一个奇怪的问题。
所以CASE 1返回200 OK和一个不错的列表
public IActionResult GetTrades(int id)
{
var positions = context.Trades.Where(x=>x.WebClientId==id).ToList();
return Ok(positions);
}
然而,在这个Trades表中,我有其他对象,这些对象由他们的id引用,我也希望到达它们,所以我使用Include()。
public IActionResult GetTrades(int id)
{
var positions = context.Trades.Where(x=>x.WebClientId==id)
.Include(s=>s.Strategy)
.Include(p=>p.Portfolio).ToList();
return Ok(positions);
}
现在,奇怪的事情开始发生了。我在Postman没有回复。没有错误,没有,只是无法得到任何回应。
然而,如果我进入调试模式并在返回时放置一个断点,我需要的一切就在那里,所有对象都在那里,我可以进入其中的每一个,策略,投资组合,并查看所有模型细节。
希望其他人有类似的问题。感谢。
答案 0 :(得分:1)
域模型中存在循环。我不得不使用AutoMapper和separete Resources模型来消除循环,一切都开始有效。
例如:
在Trade模型类中,有一个对Portfolio模型类的引用,如下所示:
public Portfolio Portfolio { get; set; } //virtual for lazy loading
public int PortfolioId { get; set; }
在Porfolios课程中,有一个像这样的Trades类的引用:
public IList<Trade> Trades { get; set; }
我在没有循环的情况下将这两个类重新创建为PortfolioResource和TradeResource,并编辑控制器以使用AutoMapper,如下所示:
public async Task<IEnumerable<TradeResource>> GetPositions(int id)
{
var positions = await context.Trades
.Where(x => x.WebClientId == id)
.Include(s => s.Strategy)
.Include(p => p.Portfolio)
.ToListAsync();
return mapper.Map<List<Trade>, List<TradeResource>>(positions);
}
在使用
在ASP.NET Core中正确安装AutoMapper之后,我还为此创建了一个映射配置文件1)dotnet添加包AutoMapper 2)dotnet add package AutoMapper.Extensions.Microsoft.DependancyInjection 3)dotnet restore
还添加了services.AddAutoMapper();到ConfigureServices
中的StartUp.cs最好是映射器类。
public class MappingProfie:Profile
{
public MappingProfie()
{
CreateMap<Trade, TradeResource>();
CreateMap<Portfolio, PortfolioResource>();
CreateMap<WebClient, WebClientResource>();
CreateMap<Strategy, StrategyResource>();
}
}
此后一切都开始了。