我在实体框架中有很多关系,由于循环无限(使用newtonsoft),导致序列化问题(使用newtonsoft),我得到了:自引用循环检测到错误:
我尝试了Self referencing loop Entity FrameWork
中的选项设置 config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling
= Newtonsoft.Json.ReferenceLoopHandling.Ignore;
但是它不能解决它。我的课程如下:
public class Job
{
public int Id { get; set; }
public string Title { get; set; }
public virtual ICollection<Tag> Tags { get; set; }
}
public class Tag
{
public int Id { get; set; }
public string Title { get; set; }
public ICollection<Job> Jobs { get; set; }
}
因此在.net中,当我搜索职位时,可以告诉它仅包含标签,之后不包含职位吗?即:
// How to not include jobs in tags object?
var jobs = context.Job.Include(x => x.Tags);
答案 0 :(得分:1)
简单的答案是“不要将实体发送给客户端,请使用视图模型。”
如果您的客户关心的只是一个工作及其标签列表:
[Serializable]
public class JobViewModel
{
public int JobId { get; set;}
public string Title { get; set; }
public List<TagViewModel> Tags { get; set; } = new List<TagViewModel>();
}
[Serializable]
public class TagViewModel
{
public int TagId { get; set; }
public string Title { get; set; }
}
然后,选择所有作业及其标签:(理想情况下,它应该具有Where子句或分页,但例如)
var jobs = context.Jobs.Select(j => new JobViewModel
{
JobId = j.JobId,
Title = j.Title,
Tags = j.Tags.Select(t => new TagViewModel
{
TagId = t.TagId,
Title = t.Title
}).ToList()
}).ToList();
您可以避免使用AutoMapper进行手动转换,它的ProjectTo<T>
方法与EF基于IQueryable
的方法很好地集成在一起。
var jobs = context.Jobs
.ProjectTo<JobViewModel>()
.ToList();
为什么?