当前位置: 首页 > 面试题库 >

EntityFramework到Json的解决方法?(序列化类型为... DynamicProxies的对象时检测到循环引用)

汪典
2023-03-14
问题内容

所以这是我的交易

楷模

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结果也更轻量。



 类似资料:
  • 问题内容: 上课: 和控制器代码: 它适用于LOCALHOST,但不适用于实时服务器: 错误: Json序列化类型的对象时检测到循环引用 我进行了搜索并找到了属性,因此将模型更改为 但是在实时服务器(win2008)上也会发生相同的错误。 如何避免该错误并成功序列化父数据? 问题答案: 尝试以下代码: …或者如果您仅需要父属性: 它并不是解决问题的真正方法,但在序列化DTO时是一种常见的解决方法。

  • 问题内容: 我正在尝试做一个简单的JSON返回,但是我遇到以下问题。 我得到一个HTTP 500,但此问题的标题中显示了例外。我也试过 那也带来了同样的问题。 这是错误还是我的实现? 问题答案: 看来您的对象层次结构中有循环引用,而JSON序列化程序不支持。您是否需要所有列?您只能在视图中选择所需的属性: 这将使您的JSON对象更轻便,更易于理解。如果您有许多属性,则可以使用AutoMapper

  • 我面临一个问题,导致我出现以下错误: 序列化类“App\Entity\User”(配置的限制:1)的对象时检测到循环引用 我有一个拥有任务订单、车辆和用户的企业实体。 与用户、公司和车辆有关系的订单实体。 以及与订单和公司有关系的用户实体。 所以我有这个:enterprise.php ORD.php: 五ehicule.php: User.php: 当我想添加一辆新车时,我会得到以下错误: 序列化

  • 问题内容: 如果我从json.net获得序列化的JSON,如下所示: 我想让淘汰赛在FooList上输出foreach,但是我不确定如何继续,因为$ ref东西可能会抛出东西。 我在想解决方案将以某种方式通过不使用以下方式强制将所有Foos呈现在FooList中: 但这似乎很浪费。 问题答案: 从服务器接收的json对象包含循环引用。在使用对象之前,您必须首先 从对象中删除所有属性,这意味着`$r

  • 问题内容: 我尝试序列化从实体数据模型.edmx自动生成的POCO类,使用时 我收到以下错误: 错误检测到类型为System.data.entity的自引用循环。 我该如何解决这个问题? 问题答案: 那是最好的解决方案 https://code.msdn.microsoft.com/Loop-Reference-handling-in- caaffaf7 (我选择/尝试了这个,还有很多其他选择)

  • 我有一个数据结构藏书集,里面有一套书。每本书都有它所在藏书的参考文献。这是一种标准的一对多关系。它在服务器端工作得很好,但是我必须把它发送到客户端。该应用程序使用Jackson ObjectMapper进行序列化,设置为Spring Bean。问题是,您不能简单地序列化一个图书集合和书籍,因为标准JSON中没有引用(我确实需要标准JSON)。 当前的解决方案是把@JsonIgnore放在Book.