请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

获取购物车信息

GetShoppingCart函数的最后一行尝试了一下不映射为Dto,直接return Ok(shoppingCart),结果返回了500。图片描述
按道理映射为Dto只是为了将实际的数据模型与用户看到的信息隔离开,不映射也不会产生太大的问题。可是这里shoppingCart在转换为json的时候却产生了一种循环引用的错误。请问老师能否解答一下是什么原因?

代码和课程保持一致,只是把最后的return Ok(_mapper.Map<ShoppingCartDto>(shoppingCart));改为了return Ok(shoppingCart);

正在回答 回答被采纳积分+3

1回答

阿莱克斯刘 2020-07-31 17:41:46

是的,正如你所说,问题的原因就是在直接输出数据模型的时候会产生循环嵌套。举个例子,就是shoppingcart里有一个指向user的对象 而user内又有一个指回shoppingcart的引用,数据在输出json的时候就会如此反复、陷入无限循环,最后导致奔溃产生500错误。那为什么只有在输出json的时候才会崩溃呢?这就是因为c#中有一种机制叫做lazy load延迟加载,也就是说程序运行时先不提取数据,直到数据输出才执行数据提取,提取数据的时候发现有循环,这时候系统就崩了。因为这种崩溃情况只会发生在直接输出嵌套模型得情况下,所以规避方法其实也很简单,就是做data transfer数据变换(也就是dto),当进行数据变换的时候数据间原本的联系就会被切断、进行重组,于是嵌套循环的关系就不存在了。而我们课程中使用的映射工具automapper就是用来处理这个过程的。

0 回复 有任何疑惑可以回复我~
  • 提问者 Sea_Man #1
    我又尝试了一下GetTouristRoutes直接返回数据模型,一切正常。可是TouristRoutes和TouristRoutePicture不是也有循环嵌套关系吗?(Route内有Picture的集合,Picture内有所属Route的引用)
    
    请问老师这是不是因为购物车和用户是一对一的关系而旅游路线和照片是一对多的关系?
    回复 有任何疑惑可以回复我~ 2020-07-31 17:49:52
  • 提问者 Sea_Man #2
    阿老师好,我刚才又做了一个实验。我把User中保存的ShoppingCart去掉而不去除ShoppingCart和ShoppingCartItem之间的循环嵌套关系也可以正常运行。看起来确实是只有一对一的循环嵌套关系会导致json无穷嵌套的问题。
    回复 有任何疑惑可以回复我~ 2020-07-31 19:02:25
  • 这个问题。。。我也没法解释了?,只能认为是一对一和一对多的区别了。回头我也查查资料,看看能不能找到比较让人满意的答案。
    回复 有任何疑惑可以回复我~ 2020-08-01 01:03:54
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信