在MVC5 / EF6中序列化数据模型时检测到自引用循环



在使用'Json序列化时,我得到这个错误"检测到自我引用循环"。的

我有一个Book模型

public class Book
{
    public Book()
    {
        BookPersonMap = new List<BookPersonMap>();
    }
    public int BookId { get; set; }
    public virtual ICollection<BookPersonMap> BookPersonMap { get; private set; }
    (And many other virtual Icollections)
}

这是BookPerson Mapping类:

public class BookPersonMap
{
    public int BookId { get; set; }
    public string PersonName { get; set; }
    public int PersonTypeId { get; set; }
    public virtual Book Book { get; set; } // Foreign keys
    public virtual PersonType PersonType { get; set; }
}

当我尝试序列化Book对象时,它抛出:

"Self referencing loop detected for property 'Book' with type 'System.Data.Entity.DynamicProxies.Book_57F0FA206568374DD5A4CFF53C3B41CFDDC52DBBBA18007A896 08A96E7A783F8'. Path 'BookPersonMap[0]'."

我已经尝试了一些类似帖子中建议的事情例子:

  1. PreserveReferencesHandling = PreserveReferencesHandling。序列化设置中的对象返回一个长度为300万的字符串!

  2. ReferenceLoopHandling = ReferenceLoopHandling。忽略序列化设置中的:"An exception of type 'System.OutOfMemoryException' occurred in Newtonsoft.Json.dll but was not handled in user code"

  3. ^与"ReferenceLoopHandling"相同。序列化"

  4. MaxDepth = 1 :无限循环了。

[JsonIgnore]放在虚拟属性上正在工作,但这是一项繁琐的任务(因为有许多FK引用)并且效率不高,因为如果我错过一个属性,它将抛出异常。

上面的Json设置为他们不工作缺少什么?

services.AddMvc().AddJsonOptions(opt => {
    opt.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
});                                               

我发现解决这类错误的最好方法是使用视图模型来平坦你的模型。

在序列化对象并开始钻取子属性之前,在对象上设置一个断点。你可能会发现你可以无限地继续下去。

这是序列化器阻塞的地方

为你的控制器创建一个构造函数,并在上面添加这行代码:db.Configuration.ProxyCreationEnabled = false;//db是context的实例

对于asp.net mvc 5使用

将下面的代码添加到globax.asax filestartup文件中的Application_Start方法中。

protected void Application_Start()
    {
       ..
        GlobalConfiguration.Configuration.Formatters.JsonFormatter
                    .SerializerSettings
                    .ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
}

禁用延迟加载和确保控制器不返回

Json(..obj)

它应该返回

Ok(..obj)

最新更新