Почему в веб-API, возвращающем объект, имеющий отношение "один ко многим", возникает ошибка?

Ребята, у меня отношение «один ко многим» к одному и тому же классу, называемому пользователем,
я возвращаю один экземпляр пользователя в методе получения веб-API, он отлично работает, поскольку у меня его нет

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 

Это мой GetMethod

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

Если я получу и верну объект User, я получу ошибку удара

Может ли кто-нибудь помочь мне исправить эту ошибку ниже?

Попробуйте сменить форматтер webApi. Добавьте эти строки в WebApiConfig.cs:


person Kas    schedule 29.10.2013    source источник
comment
На самом деле я использую Guid в качестве идентификатора, но в своем вопросе я сказал это как поле int, потому что я думаю, что ошибка не вызвана из-за руководства, однако я ожидаю от кого-то хорошего решения :)   -  person Kas    schedule 29.10.2013
comment
Можете ли вы попробовать запрос exec и не возвращаться к сведению, похоже, у вас есть ошибка в ваших моделях. Попробуйте это: var t = db.Users.SingleOrDefault (x = ›x.ID == 0); return (Пользователь) null;   -  person Kas    schedule 29.10.2013
comment
Это возвращает пользователя с нулевым идентификатором, но он не возвращается из веб-api, я запрашиваю формат json в качестве типа возврата веб-api, я отлаживал метод get, и я могу получить правильный объект пользователя, но когда верните его из веб-api, я получаю эту ошибку   -  person alexmac    schedule 29.10.2013
comment
Покажи мне свои модели Пользователь и друг   -  person Kas    schedule 29.10.2013
comment
Мои классы модели и пользователя немного сложнее, чем тот, который я показал для вопроса   -  person alexmac    schedule 29.10.2013
comment
Попробуйте украсить свои модели _1_   -  person Kas    schedule 29.10.2013
comment
Айдин, это не помогло, я могу видеть только идентификатор в результате, когда украшаю свою модель DataContract (IsReference = true)   -  person Aidin    schedule 29.10.2013
comment
Не могли бы вы объяснить, почему и что это делает?   -  person Kas    schedule 30.10.2013


Ответы (2)


И добавьте эту строку:

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

Примените атрибут

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
person alexmac    schedule 29.10.2013
comment
@Richard_D убедитесь, что вы удалили свои json-конфигурации из файла Global.ascx (если они у вас есть) - person KidCode; 16.01.2016
comment
Как это сделать с DB first EF? - person stoic; 30.06.2016

Обновил свой вопрос, я добавил свой GetMethod к вопросу

person B-Lat    schedule 24.02.2014
comment
Насколько я знаю, это то же самое. Сначала я использовал БД, поэтому, если вы не используете генератор, чтобы продолжать восстанавливать объекты домена из базы данных, то вышеуказанное должно работать. - person seebiscuit; 12.08.2016
comment
Вот в чем проблема; Я использую генератор :( и он обновляется время от времени, когда происходит изменение схемы ... Я помню, что видел обходной путь с частичными параметрами. - person B-Lat; 23.08.2016
comment
Вот как вы добавляете атрибуты в отдельный класс, который работает со сгенерированным кодом ... [stackoverflow.com/questions/16736494/ - person seebiscuit; 23.08.2016
comment
{"Сообщение": "Произошла ошибка.", "ExceptionMessage": "Типу 'ObjectContent`1' не удалось сериализовать тело ответа для типа содержимого 'text / html; charset = utf-8'.", "ExceptionType ":" System.InvalidOperationException "," StackTrace ": null," InnerException ": {" Сообщение ":" Произошла ошибка. "," ExceptionMessage ":" Обнаружен цикл самореференции с типом 'System.Data.Entity.DynamicProxies .Friend_E5C79F4736EB2750392FFC7061B18E9C12F15F9583409603C75C5D1B1F7358D4 '. Путь' Friends1 [0] .User.Friends '. »,« ExceptionType »:« Newtonsoft.Json.JsonSerializationTrace, Newtonsoft.Json.JsonSerializationTrace, Newtonsoft.Json.JsonSerializationTrace, Newtonsoft.Json.JsonSerializationTrace value, свойство JsonProperty, контракт JsonContract, JsonContainerContract containerContract, JsonProperty containerProperty) \ r \ n в Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeList (писатель JsonWriter, значения IWrappedCollection, контракт JsonArrayContract, J membersonArrayContract, контракт J tract collectionContract, JsonProperty containerProperty) \ r \ n в Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue (JsonWriter writer, значение объекта, JsonContract valueContract, член JsonProperty, Контракт JsonContainerContracterContract.JsonProperty контейнер. JsonSerializerInternalWriter.SerializeObject (писатель JsonWriter, значение объекта, контракт JsonObjectContract, член JsonProperty, JsonContainerContract collectionContract, JsonProperty containerProperty) \ r \ n в Newtonsoft.Json.Serialization.JsonWriter valueConttainer Json, значение JsonSerialConttainer, JsonSonizeWriter, JsonSerializer value, JsonConttainer value, JsonSerializer value, JsonSerialConttainer value, JsonSerializer value, JsonConttainer value, JsonSerializer value, JsonConttainer value, JsonSerializer value, JsonSonic value, JsonSerializer value, JsonSerial, valueConttainer Json, JsonSerializer value, JsonSerial, значение JsonConttainer, JSON, значение JsonSerialConttainer, JSON, значение JsonSerial, значение JsonConttainer, JsonSerial, значение JsonSerial, значение JsonConttainer, JsonSerialization. containerContract, JsonProperty containerProperty) \ r \ n в Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject (писатель JsonWriter, значение объекта, контракт JsonObjectContract, член JsonProperty, Контракт коллекции JsonContainerContract, JsonProperty containerPr operty) \ r \ n в Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue (писатель JsonWriter, значение объекта, JsonContract valueContract, член JsonProperty, JsonContainerContract containerContract, JsonProperty containerProperty) \ r \ n в Newritialization.Json. Автор JsonWriter, значения IWrappedCollection, контракт JsonArrayContract, член JsonProperty, JsonContainerContract collectionContract, JsonProperty containerProperty) \ r \ n в Newtonsoft. Json.Serialization.JsonSerializerInternalWriter.SerializeValue (писатель JsonWriter, значение объекта, JsonContract valueContract, член JsonProperty, JsonContainerContract containerContract, JsonProperty containerProperty) \ r \ n в Newtonsoft.Json.Serialization.Json.Serialization.JsonOverviewBriterializer Член JsonProperty, Контракт коллекции JsonContainerContract, JsonProperty containerProperty) \ r \ n в Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue (писатель JsonWriter, значение объекта, Контракт значения JsonContract, член JsonProractty.контейнер JsonContainer \ Контракт NewContainer, контейнер JsonContract. .Serialization.JsonSerializerInternalWriter.Serialize (JsonWriter jsonWriter, значение объекта) \ r \ n в Newtonsoft.Json.JsonSerializer.SerializeInternal (JsonWriter jsonWriter, значение объекта) \ r \ n в Newtonsoft.Json.JsonSerializer (значение JsonSerializer, Object ) \ r \ n в System.Ne t.Http.Formatting.JsonMediaTypeFormatter. ‹> c__DisplayClassd.b__c () \ r \ n в System.Threading.Tasks.TaskHelpers.RunSynchronously (действие действия, токен CancellationToken)"}} - person Carter Medlin; 07.08.2018