我正在使用Entity Framework,并且在将父数据和子数据获取到浏览器时遇到问题。这是我的课程:
public class Question { public int QuestionId { get; set; } public string Title { get; set; } public virtual ICollection<Answer> Answers { get; set; } } public class Answer { public int AnswerId { get; set; } public string Text { get; set; } public int QuestionId { get; set; } public virtual Question Question { get; set; } }
我正在使用以下代码返回问题和答案数据:
public IList<Question> GetQuestions(int subTopicId, int questionStatusId) { var questions = _questionsRepository.GetAll() .Where(a => a.SubTopicId == subTopicId && (questionStatusId == 99 || a.QuestionStatusId == questionStatusId)) .Include(a => a.Answers) .ToList(); return questions; }
在C#方面,这似乎可行,但是我注意到答案对象具有对该问题的引用。当我使用WebAPI将数据获取到浏览器时,收到以下消息:
‘ObjectContent`1’类型未能序列化内容类型’application / json的响应主体;charset = utf-8’。 为类型为“ Models.Core.Question”的属性“ question”检测到自引用循环。
‘ObjectContent`1’类型未能序列化内容类型’application / json的响应主体;charset = utf-8’。
为类型为“ Models.Core.Question”的属性“ question”检测到自引用循环。
这是因为问题有答案,而答案有对问题的引用吗?我看过的所有地方都建议在孩子中参考父母,所以我不确定该怎么做。有人可以给我一些建议吗?
这是因为问题有答案,而答案有对问题的引用吗?
是。无法序列化。
编辑:请参阅Tallmaris的答案和OttO的评论,因为它更简单并且可以全局设置。
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
旧答案:
将EF对象Question投影到您自己的中间对象或DataTransferObject。然后可以成功序列化此Dto。
Question
public class QuestionDto { public QuestionDto() { this.Answers = new List<Answer>(); } public int QuestionId { get; set; } ... ... public string Title { get; set; } public List<Answer> Answers { get; set; } }
就像是:
public IList<QuestionDto> GetQuestions(int subTopicId, int questionStatusId) { var questions = _questionsRepository.GetAll() .Where(a => a.SubTopicId == subTopicId && (questionStatusId == 99 || a.QuestionStatusId == questionStatusId)) .Include(a => a.Answers) .ToList(); var dto = questions.Select(x => new QuestionDto { Title = x.Title ... } ); return dto; }