이것과 오랫동안 투쟁했습니다. 저는 ASP.NET 웹 API를 사용하여 데이터베이스와의 깔끔하고 쉬운 HTTP / JSON 상호 작용을 제공하고 있습니다. 다음과 같은 엔티티 이름 예약이 있습니다.
// Reservation
public class Reservation
{
public int ID { get; set; } // ID (Primary key)
public int EquipmentID { get; set; } // EquipmentID
public string Username { get; set; } // Username
public DateTime BeginDateTime { get; set; } // BeginDateTime
public int? Duration { get; set; } // Duration
public int? ReservationStateID { get; set; } // ReservationStateID
public DateTime? CheckInDateTime { get; set; } // CheckInDateTime
public string Note { get; set; } // Note
// Foreign keys
public virtual Equipment Equipment { get; set; } // FK_Reservation_EquipmentID
public virtual ReservationState ReservationState { get; set; } //FK_Reservation_ReservationState
}
여태까지는 그런대로 잘됐다. http 요청과 함께 Reservation JSON 개체를 전달하는 간단한 Python 스크립트를 실행하여 새 예약을 만듭니다. 전생에는 데이터 유효성 검사없이 코드를 추가하는 예약을 실행하고 HttpActionResult에 Reservation 개체를 반환했습니다. 내가 그 대가로 본 것은 멋진 json 객체였습니다.
{u'Username ': u'name', u'ReservationStateID ': 1, u'Equipment': 없음, u'EquipmentID ': 2, u'BeginDateTime': u'2014-05-31T14 : 00 : 00Z ', u'Note ': u' ', u'CheckInDateTime': 없음, u'Duration ': 10800, u'ReservationState': 없음, u'ID ': 51}
나는 외래 키 Equipment 및 ReservationState가 반환 된 객체에 포함되어 더 큰 문제에 도움이 될 수 있지만 적시에 해당 키에 대해 약간 걱정합니다. 이제 예약에서 참조하는 장비 항목을 수집하여 데이터 유효성 검사를 실행하려고합니다 .
Equipment equipmentItem = await db.Equipment.FindAsync(newRes.EquipmentID);
이제 동일한 Python 스크립트에서 동일한 데이터를 사용하여 동일한 작업을 수행하려고 할 때 수신 된 결과는 큰 무서운 오류입니다.
" 'ObjectContent`1'유형이 'application / json; charset = utf-8'컨텐츠 유형에 대한 응답 본문을 직렬화하지 못했습니다.", u'StackTrace ': 없음, u'Message': u '오류가 발생했습니다. ', u'InnerException': {u'ExceptionMessage ': u "'Equipment '속성에 대해 자체 참조 루프가 감지되었습니다.
내 데이터베이스에있는 외래 키가 순환 참조를 생성하지 않는다고 99 % 긍정적이지만 아쉽습니다. 다시 "성공적인"json 결과에 외래 키가 포함 되어 있음을 지적하고 싶습니다 . 내가 제거 할 수 있다면 자기 참조 문제를 제거 할 수있을 것입니다. 도와 주셔서 감사합니다!
이 오류는 외래 키 개체에 대한 프록시를 만드는 EF로 인해 발생했으며, 프록시로 직렬화 할 때 기본 serializer (DataContractSerializer) 오류가 발생했습니다. 해결 방법은 Global.asax.cs 파일에 다음 줄을 추가하는 것입니다.
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
@SKall의 답변으로 문제가 해결되었지만 IgnoreDataMember 속성을 부여한 속성에 대해서만 프로젝트 전체에서 해결되지 않았습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다