所以这是我的交易
楷模
public class News { public News() { this.Created = DateTime.Now; } public int Id { get; set; } public string Title { get; set; } public string Preamble { get; set; } public string Body { get; set; } public DateTime Created { get; set; } public int UserId { get; set; } public virtual User User { get; set; } public int CategoryId { get; set; } public int ImageId { get; set; } public virtual Image Image { get; set; } public virtual Category Category { get; set; } } public class Image { public int Id { get; set; } public string Name { get; set; } public string ImageUrl { get; set; } public Byte[] ImageData { get; set; } public string ImageMimeType { get; set; } } public class Category { public int Id { get; set; } public string Name { get; set; } }
....以下模型(这些模型已连接到EfDbContext)已连接到以下存储库…
接口/存储库
public class NewsRepository : INewsRepository { EfDbContext context = new EfDbContext(); public IQueryable<News> All { get { return context.News; } } public IQueryable<News> AllIncluding(params Expression<Func<News, object>>[] includeProperties) { IQueryable<News> query = context.News; foreach (var includeProperty in includeProperties) { query = query.Include(includeProperty); } return query; } public News Find(int id) { return context.News.Find(id); } public void InsertOrUpdate(News news) { if (news.Id == default(int)) { // New entity context.News.Add(news); } else { // Existing entity context.Entry(news).State = EntityState.Modified; } } public void Delete(int id) { var news = context.News.Find(id); context.News.Remove(news); } public void Save() { context.SaveChanges(); } } public interface INewsRepository { IQueryable<News> All { get; } IQueryable<News> AllIncluding(params Expression<Func<News, object>>[] includeProperties); News Find(int id); void InsertOrUpdate(News news); void Delete(int id); void Save(); }
在我的HomeController()中,我得到了一个JsonResult方法,我想返回上下文。这是方法
杰森请求
[HttpGet] public JsonResult GetNews() { var p = newsRepository.AllIncluding(news => news.Category, news => news.Image); return Json(p, JsonRequestBehavior.AllowGet); }
我收到以下错误:
序列化类型为’System.Data.Entity.DynamicProxies.News_96C0B16EC4AC46070505EEC7537EF3C68EE6CE5FC3C7D8EBB793B2CF9BD391B3’的对象时,检测到循环引用。
我猜想这与延迟加载的东西有关(我目前正在学习C#),我发现了有关此的文章…
http://hellowebapps.com/2010-09-26/production-json-from-entity- framework-4-0-generation- classes/
但是我没有使它工作。我能读到的有关代码的信息是,他们正试图通过对象深度搜索……更多的是我不知道。
我的问题是如何传递lazyLoading对象?进入json / serializer或不存在,对如何进行的任何想法?
由于Json是基于树的序列化格式,因此在引用A-> B-> A时会遇到问题。 我读过某个地方,可以在视图模型中使用ScriptIgnore属性来防止此错误。但是还没有测试。
您可以将代码更改为以下内容(使用匿名类型)以成功检索项目:
var p = newsRepository.AllIncluding(news => news.Category, news => news.Image) .Select(n => new {id = n.Id, Body = n.Body});
在最后一个Select方法中包括您希望显示的任何其他属性。这也使您的Json结果也更轻量。
Select