EF webapi json序列化 表间相互引用 无限循环问题解决方案

时间:2023-03-08 22:51:40
EF webapi json序列化 表间相互引用 无限循环问题解决方案

WebApiConfig.cs中加入 如下代码即可解决无限循环问题

            var json = config.Formatters.JsonFormatter;
// 解决json序列化时的循环引用问题
json.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
// 干掉XML序列化器
config.Formatters.Remove(config.Formatters.XmlFormatter);

另外还有一个问题就是ef 如果用到 lazy加载的话, 输出的ef实体 会将关联表数据 都输出出来,解决方案是:

1.将没用的字段置空

2.用动态类型输出,例如: return  new{xx=user.userId,yy=...}

3.将virtual属性标记为 忽略输出json(可通过ef tt模板实现)

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Runtime.Serialization;
using System.Web;
using System.Xml.Serialization; namespace CircularReferenceSample.Models
{
// Fix 3
[JsonObject(IsReference = true)]
public class Category
{
public int Id { get; set; }
public string Name { get; set; } // Fix 3
//[JsonIgnore]
//[IgnoreDataMember]
public virtual ICollection<Product> Products { get; set; }
} [DataContract(IsReference = true)]
public class Product
{
[Key]
public int Id { get; set; } [DataMember]
public string Name { get; set; } [DataMember]
public virtual Category Category { get; set; }
}
}