c# - 每次我使用多个表时序列化类型对象时检测到循环引用
问题描述
我想从我的控制器返回 json 数据,但我得到的错误是“在序列化类型对象时检测到循环引用”。
到目前为止,我只能从一个名为“Projects”的表中返回数据,但是当我尝试包含我的查找表“ProjectTypes”时,我得到了循环引用。如果有办法返回项目数据及其正确的项目类型,请帮助我。
public JsonResult getProjects()
{
bool proxyCreation = dc.Configuration.ProxyCreationEnabled;
try
{
//set ProxyCreation to false
dc.Configuration.ProxyCreationEnabled = false;
var projects = dc.Projects.Include(p => p.ProjectType);
return Json(projects.ToList(), "application/json", System.Text.Encoding.UTF8, JsonRequestBehavior.AllowGet);
}
catch (Exception ex)
{
Response.StatusCode = (int)HttpStatusCode.BadRequest;
return Json(ex.Message);
}
finally
{
//restore ProxyCreation to its original state
dc.Configuration.ProxyCreationEnabled = proxyCreation;
}
}
下面是我的项目和项目类型类
public partial class Project
{
public int ProjectID { get; set; }
public string Description { get; set; }
public System.DateTime StartDate { get; set; }
public Nullable<System.DateTime> EndDate { get; set; }
public System.DateTime ProjectedEndDate { get; set; }
public int ProjectTypeID { get; set; }
public virtual ProjectType ProjectType { get; set; }
}
public partial class ProjectType
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public ProjectType()
{
this.Projects = new HashSet<Project>();
}
public int ProjectTypeID { get; set; }
public string Description { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Project> Projects { get; set; }
}
我期望得到的结果是
[{"ProjectID":0,"Description":"看动漫","StartDate":"/Date(1569016800000)/","EndDate":null,"ProjectedEndDate":"/Date(1569016800000)/"," ProjectType":Maintainance,"ProjectType":null},{"ProjectID":1,"Description":"割草","StartDate":"/Date(1569362400000)/","EndDate":null,"ProjectedEndDate" :"/Date(1569448800000)/","ProjectType":Maintainance,"ProjectType":null}]
或 Project 和 ProjectTypes Table 的组合 json 结果,但我得到的实际结果是如上所述的错误消息。
解决方案
有一个无限循环,其中对象的ProjectType
导航属性Project
指向其相关ProjectType
对象,其Projects
导航属性包括Project
对象等。
无法禁用此行为,因此避免相关数据无限循环的最佳解决方案是在导航属性到达 JSON 序列化程序之前将其设置为 null 以创建动态类型,以便结果中不包含 null 值,这是我在下面的示例中采用的方法:
public JsonResult getProjects()
{
// Code omitted
var projects = dc.Projects.Include(p => p.ProjectType)
.Select(p => new {
Id = p.Id,
ProjectType = new {
Id = p.ProjectType.Id,
}
});
return Json(projects.ToList(), "application/json", System.Text.Encoding.UTF8, JsonRequestBehavior.AllowGet);
}
第二个选项:(虽然,这只是隐藏了问题,并没有真正解决它。)
services.AddMvc().AddJsonOptions(opts =>
opts.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore);
推荐阅读
- c# - 如何在 Razor 页面中动态生成文件以供下载
- .net-core - 如何将 exe 发布与控制台 .net core 2.2 应用程序的 VS2019 构建集成?
- mongodb - 如何在 MongoDB 中找到按行数排序的最受欢迎的 ID?
- android - YouTube 嵌入式视频观看次数不计入 Android 应用
- node.js - 从反应应用程序路由以获取从车把生成的服务器端呈现的 HTML
- javascript - 在 [ View ] [ ASP.NET MVC ] 中使用 Java Script 不会更改 src
- python - pytest,用户输入和异常
- pytorch - 在 PyTorch 中降低 Adam 优化器学习率的首选方法
- opayo - 允许使用我们网站的客户直接向我们的客户 Sage Pay 帐户付款
- javascript - 如果文件和要求被删除,如何修复 node.js 中的“错误:ENOENT”?