1

如何解决one to manyasp.net中的关系问题?

我有Topic其中包含许多playlists.

我的代码:

public class Topic
{
    public int Id { get; set; }
    public String Name { get; set; }
    public String Image { get; set; }
    --->  public virtual List<Playlist> Playlist { get; set; }
}

public class Playlist
{
    public int Id { get; set; }
    public String Title { get; set; }
    public int TopicId { get; set; }
    ---> public virtual Topic Topic { get; set; }
}

我的控制器功能

[Route("data/binding/search")] 
public JsonResult Search()
{
    var search = Request["term"];
    var result=  from m in _context.Topics where m.Name.Contains(search) select m;
    return Json(result, JsonRequestBehavior.AllowGet);
}

当我调试我的代码时,我会看到一个无限的数据,因为Topics会调用playlist然后playlist会调用Topics,最后一次调用Topic会调用playlist等等......!

一般来说,当我只是使用这种关系在视图中打印我的数据时,我没有收到任何错误,并且 ASP.NET MVC 5 处理了这个问题。

当我尝试打印数据时出现Json问题

在此处输入图像描述

有什么方法可以防止 JSON 中的无限数据循环?我只需要第一次的数据而不需要一次又一次的调用

4

1 回答 1

3

您收到错误是因为您的实体类具有循环属性引用。

要解决此问题,您应该在 LINQ 查询中进行投影以仅获取所需的数据(Topic实体数据)。

以下是如何将其投影到具有IdNameImage属性的匿名对象。

public JsonResult Search(string term)
{
    var result = _context.Topics
                         .Where(a => a.Name.Contains(term))
                         .Select(x => new
                                          {
                                               Id = x.Id,
                                               Name = x.Name,
                                               Image = x.Image 
                                });
    return Json(result, JsonRequestBehavior.AllowGet);
}

如果您有一个视图模型来表示主题实体数据,您可以在投影部分使用它而不是匿名对象

public class TopicVm
{
    public int Id { set;get;}
    public string Name { set;get;}
    public string Image { set;get;}
}
public JsonResult Search(string term)
{
    var result = _context.Topics
                         .Where(a => a.Name.Contains(term))
                         .Select(x => new TopicVm
                                          {
                                               Id = x.Id,
                                               Name = x.Name,
                                               Image = x.Image 
                                          });
    return Json(result, JsonRequestBehavior.AllowGet);
}

如果您还想包含播放列表属性数据,您可以在投影部分中执行此操作。

public JsonResult Search(string term)
{
    var result = _context.Topics
                         .Where(a => a.Name.Contains(term))
                         .Select(x => new
                                          {
                                               Id = x.Id,
                                               Name = x.Name,
                                               Image = x.Image,
                                               Playlist = x.Playlist
                                                           .Select(p=>new
                                                            {
                                                              Id = p.Id,
                                                              Title = p.Title
                                                            })
                                });
    return Json(result, JsonRequestBehavior.AllowGet);
}
于 2018-07-07T18:56:38.800 回答