다음과 같은 수업이 있습니다
[DataContract]
public class Video
{
[Key]
[DataMember(IsRequired = false)]
public int VideoId { get; set; }
[DataMember(IsRequired = false)]
public int UserId { get; set; }
[Required]
[DataMember ]
public string Title { get; set; }
[Required]
[DataMember]
public virtual IList<Tag> Tags { get; set; }
}
[DataContract]
public class Tag
{
[Key]
[Required]
[DataMember(IsRequired = false)]
public int? TagId { get; set; }
[DataMember(IsRequired = true)]
[Required]
public string Name { get; set; }
[IgnoreDataMember]
public virtual IList<Video> Videos { get; set; }
}
내 WebAPI 컨트롤러에서 다음을 호출합니다.
var videos = _service.GetVideos();
return Request.CreateResponse(HttpStatusCode.OK, videos);
이것을 부르는 :
public IList<Video> GetVideos()
{
using (var db = CreateContext())
{
return db.Videos.Include("Tags").ToList();
}
}
그러나 와이어를 통해 이것은 내가 얻는 것입니다.
[{
"$id": "8",
"tags": [
{
// CORRECT SERIALIZATION
"$id": "9",
"tagId": 1,
"name": "Example",
"count": 5
}
],
"videoId": 18,
"userId": 3,
"title": "Test Video",
"thumbnail": "http://i.imgur.com/gV3J2Uf.png",
"source": "test source"
},
{
"$id": "19",
"tags": [
{
// WTF?
"$ref": "9"
}
],
"videoId": 28,
"userId": 6,
"title": "Test Video",
"thumbnail": "http://i.imgur.com/gV3J2Uf.png",
"source": "test source"
},
{
"$id": "20",
"tags": [
{
// CORRECT AGAIN
"$id": "21",
"tagId": 10,
"name": "funny",
"count": 2
}
],
"videoId": 29,
"userId": 6,
"title": "TEST VID",
"thumbnail": "https://i.imgur.com/SWOQSOf.jpg",
"source": "test source"
},
{
"$id": "22",
"tags": [
{
// INCORRECT
"$ref": "9"
},
{
"$ref": "21"
}
],
"videoId": 30,
"userId": 6,
"title": "TEST VID",
"thumbnail": "https://i.imgur.com/R7lVobX.jpg",
"source": "test source"
}
어떤 이유로- tags
때로는 올바르게 직렬화되고 때로는 그렇지 않습니다. 내가 뭘 잘못하고 있는지 아십니까?
개체 그래프에 순환 참조가 있습니다. JSON을 올바르게 직렬화 할 수 없으며 직렬화 기는이 조건을 감지하고 자동으로 참조 ( $ref
)를 만듭니다 . EF를 사용하여 개체 그래프를로드 할 때 JSON에서 올바르게 표현할 수없는 메모리의 개체간에 순환 참조가 있습니다.
뷰 모델을 사용하여 원형 참조 그래프를 끊은 다음 자동 생성 된 EF 모델을 직접 반환하는 대신 와이어를 통해 뷰 모델을 보내는 것이 좋습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다