asp.net-mvc – 对Json解决方法的EntityFramework? (序列化类型对象时检测到循环引用… DynamicProxies)[复制]

前端之家收集整理的这篇文章主要介绍了asp.net-mvc – 对Json解决方法的EntityFramework? (序列化类型对象时检测到循环引用… DynamicProxies)[复制]前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
参见英文答案 > Json and Circular Reference Exception9个
所以我有这笔交易

楷模

  1. public class News
  2. {
  3.  
  4. public News()
  5. {
  6. this.Created = DateTime.Now;
  7. }
  8.  
  9. public int Id { get; set; }
  10. public string Title { get; set; }
  11. public string Preamble { get; set; }
  12. public string Body { get; set; }
  13. public DateTime Created { get; set; }
  14.  
  15. public int UserId { get; set; }
  16.  
  17. public virtual User User { get; set; }
  18.  
  19. public int CategoryId { get; set; }
  20. public int ImageId { get; set; }
  21.  
  22. public virtual Image Image { get; set; }
  23. public virtual Category Category { get; set; }
  24. }
  25.  
  26. public class Image
  27. {
  28. public int Id { get; set; }
  29. public string Name { get; set; }
  30. public string ImageUrl { get; set; }
  31. public Byte[] ImageData { get; set; }
  32. public string ImageMimeType { get; set; }
  33. }
  34.  
  35. public class Category
  36. {
  37. public int Id { get; set; }
  38. public string Name { get; set; }
  39. }

….以下模型(这些模型连接到EfDbContext)连接到以下存储库…

接口/库

  1. public class NewsRepository : INewsRepository
  2. {
  3. EfDbContext context = new EfDbContext();
  4.  
  5. public IQueryable<News> All
  6. {
  7. get { return context.News; }
  8. }
  9.  
  10. public IQueryable<News> AllIncluding(params Expression<Func<News,object>>[] includeProperties)
  11. {
  12. IQueryable<News> query = context.News;
  13. foreach (var includeProperty in includeProperties) {
  14. query = query.Include(includeProperty);
  15. }
  16. return query;
  17. }
  18.  
  19. public News Find(int id)
  20. {
  21. return context.News.Find(id);
  22. }
  23.  
  24. public void InsertOrUpdate(News news)
  25. {
  26. if (news.Id == default(int)) {
  27. // New entity
  28. context.News.Add(news);
  29. } else {
  30. // Existing entity
  31. context.Entry(news).State = EntityState.Modified;
  32. }
  33. }
  34.  
  35. public void Delete(int id)
  36. {
  37. var news = context.News.Find(id);
  38. context.News.Remove(news);
  39. }
  40.  
  41. public void Save()
  42. {
  43. context.SaveChanges();
  44. }
  45. }
  46.  
  47. public interface INewsRepository
  48. {
  49. IQueryable<News> All { get; }
  50. IQueryable<News> AllIncluding(params Expression<Func<News,object>>[] includeProperties);
  51. News Find(int id);
  52. void InsertOrUpdate(News news);
  53. void Delete(int id);
  54. void Save();
  55. }

在我的HomeController()中,我得到了一个JsonResult metod,我想返回上下文.
这是方法

Json请求

  1. [HttpGet]
  2. public JsonResult GetNews()
  3. {
  4. var p = newsRepository.AllIncluding(news => news.Category,news => news.Image);
  5. return Json(p,JsonRequestBehavior.AllowGet);
  6. }

我收到以下错误

序列化“System.Data.Entity.DynamicProxies.News_96C0B16EC4AC46070505EEC7537EF3C68EE6CE5FC3C7D8EBB793B2CF9BD391B3”类型的对象时检测到循环引用.

我猜这与懒加载的东西有关(Iam目前正在学习C#)我发现这篇文章关于这个……

http://hellowebapps.com/2010-09-26/producing-json-from-entity-framework-4-0-generated-classes/

但我没有得到它的工作…我能读到的关于代码的是他们试图深入搜索通过对象…更多我无法弄清楚.

我的问题是如何传递lazyLoading对象?进入json / serializer
或者它不存在,任何关于我如何进行的想法?

解决方法

由于Json是基于树的序列化格式,因此它具有诸如A-> B-> A的引用的问题.
我在某处读过你可以在viewmodels中使用 ScriptIgnore属性来防止这个错误.但还没有测试过.

您可以将代码更改为以下(使用匿名类型)以成功检索项目:

  1. var p = newsRepository.AllIncluding(news => news.Category,news => news.Image)
  2. .Select(n => new {id = n.Id,Body = n.Body});

包括您希望在最后一个Select方法显示的任何其他属性.这使得你的Json结果也更加轻量级.

猜你在找的asp.Net相关文章