为什么在 Web API 中返回具有一对多关系的实体会导致错误

本文关键字:实体 关系 体会 错误 一对多 Web API 返回 为什么 | 更新日期: 2023-09-27 18:37:15

>伙计们,我与同一个类有一个一对多的关系,称为用户,
我在 web apis get 方法中返回一个用户实例只要我没有,它就可以正常工作

User 
ID  | Name 
0   | A 
1   | B 
Friends Table ( This table is used to build the one to many relationship ) 
User_ID | Friend_ID 
 1      |     0 
 0      |     1 

这是我的获取方法

[HttpGet]
        public Models.User   Authenticate()
        {
            try
            {
                return   db.Users.SingleOrDefault(x => x.ID == 0 ) ; 
            } 
            catch
            {
                return null;
            }
        }

如果我得到并返回一个用户实体,那么我会收到打击错误

任何人都可以帮我修复下面的错误吗?

{"消息":"

发生错误。","异常消息":"ObjectContent'1"类型无法序列化内容类型"text/html;charset=utf-8'.","ExceptionType":"System.InvalidOperationException","StackTrace":null,"InnerException":{"Message":"发生了错误。","ExceptionMessage":"检测到类型为"System.Data.Entity.DynamicProxies.Friend_E5C79F4736EB2750392FFC7061B18E9C12F15F9583409603C75C5D1B1F7358D4"的自引用循环。路径"朋友1[0]。User.Friends'.","ExceptionType":"Newtonsoft.Json.JsonSerializationException","StackTrace":" at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CheckForCircularReference(JsonWriter writer, Object value, JsonProperty property, JsonContract contract, JsonContainerContract containerContract, JsonProperty containerProperty)''r' at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeList(JsonWriter writer, IWrappedCollection values,JsonArrayContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)''r' at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty)''r' at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value,JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)''r' at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract value, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty)''r' at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value,JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)''r' at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty)''r' at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeList(JsonWriter writer,IWrappedCollection values, JsonArrayContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)''r' at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty)''r' at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)''r' at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty)''r' at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value)''r' at Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, Object value)''r' at Newtonsoft.Json.JsonSerializer.Serialize(JsonWriter jsonWriter, Object value)''r' at System.Net.Http.Formatting.JsonMediaTypeFormatter.<>c__DisplayClassd.b__c()''r' at System.Threading.Tasks.TaskHelpers.RunSyncly(Action action, CancelToken token)"}}

为什么在 Web API 中返回具有一对多关系的实体会导致错误

尝试更改 webApi 格式化程序。在 WebApiConfig 中添加以下行.cs:

var json = config.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
config.Formatters.Remove(config.Formatters.XmlFormatter);

并添加此行:

json.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore

应用 [JsonIgnore]不希望序列化的导航属性的属性。它仍将序列化父实体和子实体,但只是避免自引用循环。