4

나는에 대한 라이브러리 (Telerik)를 사용하고 ASP.NET MVC 3원형 참조를 피하기 위해 EF POCO 자동 생성 객체를 직렬화하는 방법은 무엇입니까?

내가 AJAX하여 일부 데이터를 반환하는 데 필요한 모든 functionnalities에 문제했습니다 :

내가 연결 EF4을 사용하고 있습니다를 내 데이터베이스, 그리고 두 가지 방법으로 내비게이션 등록 정보가 필요합니다 (상상해보십시오, 일부 게시물이있는 사용자와 한 게시물은 사용자가 있습니다).

문제는 라이브러리가 JSON으로 데이터를 인코딩하는 JavaScriptSerializer를 사용하고 있다는 것입니다.

형 'System.Data.Entity.DynamicProxies.Employee_34048F4F6A98297F826C798A27640C7383E95E8EA8282EC8A5F738FA0C77CBC3'의 객체를 직렬화 동시에 I가

순환 참조를 얻을 오류가 검출되었다. "권리

예외, 부모가 자녀에 대한 참조를 가지고 있고 자녀가 부모를 참조하고 있기 때문에

나는 이미 몇 가지 해결책을 찾았지만 만족스럽지 못합니다 :

  • 를 사용하여 데이터 서버 바인딩 : 수 없다는 functionnality는 아약스에서 작동
  • 를 사용하여 익명 객체 (페이지가 끝까지 스크롤했을 때 다음 요소를로드 그리드에 대한 호출기)한다 : 데이터베이스에 필드가 추가 된 경우 모든 익명 개체에 추가해야하고, 원하는 하위 컬렉션이 필요한 경우 개체를 만들 수도 없기 때문에 유연하지 않습니다. 이 하위 목록의 모든 요소.
  • ViewModel 사용 : 필드가 하나 더있는 경우 거의 모든 문제가 발생합니다.이 필드를 모든 viewModel에 추가해야하며 내 모델과 동일한 필드가있는 모든 60 개의 뷰에 대한 뷰 모델을 작성해야합니다. ...
  • NonSerializedAttribute 사용 : 내 POCO 개체를 생성하는 T4 템플릿을 넣는 방법을 모르겠지만 제대로 작동하는지 확신 할 수 없습니다. 때때로 주 개체는 어린이, 때로는 부모 개체입니다. , 빈 관계는 또 다른 관계가되어야합니다.

난 WCF와 거의 같은 문제가 있었고 순환 참조를 처리하는 것을 알고있는 직렬화를 만들었지 만 여기에서도 같은 작업을 수행 할 수 있습니까? 아니면 이것을 관리 할 수있는 방법이 있습니까?

그렇지 않은 경우 가장 좋은 방법은 "ViewModel"을 사용하는 것이지만 그 생성 속도를 높이는 방법이 있습니까? 일반 객체와 마찬가지로 생성자에서 EF 객체를 가져 와서 순환 참조를 제거합니까? 다른 것?

오히려 [NonSerialized]보다, 당신이 필요 [ScriptIgnore]입니다

답변

5

사실 주셔서 대단히 감사합니다.

  1. 사용 RegisterConverters을 어쩌면을 사용하여,을 제외한 모든 속성 하나가 (이 아마이 너무 자동화 할 수있는 부모를 을 지정하는 사용자 정의 변환기를 쓰기 : 그래도 한 2 각도에서이 문제를 접근하는 것 [SkipSerialize("Parent")]partial class에 추가 된 것과 같은 클래스 수준의 맞춤 속성이 있습니다.

  2. 간단하게하십시오 DTO를 EF POCO를 직렬화, 대신에 사용하지 마십시오 - 그것은 이 같은 당신이 당신의 ViewModel 대답 의미하는 것입니다 소리. 개인적으로 클래스의 "엔티티"(EF/POCO) 버전과 매우 유사하지만 다른 DTO 버전을 가지고있는 데는 아무런 문제가 없습니다. 의도가 다르며 내 생각에 DRY를 위반하지 않습니다.

+0

나는 ViewModel 방식을 지원합니다. 처음 엔 중복되고 자극적이어서 엔티티의 복사본을 만드는 것처럼 보입니다. 따라서 서로 다른 직렬화 속성 또는 변환기를 사용하여 올바른 결과를 얻으려고 시도하지만 두 가지 이상의 다른 뷰에 서로 다른 일련의 작업이 직렬화되어야하는 상황에 처하게됩니다. 실패한 후에는 ViewModel을 만들고 AutoMapper (http://automapper.codeplex.com/)와 같은 것을 사용하여 엔터티 및보기 모델간에 데이터를 복사하고 갑자기 모델을 이해하는 것이 좋습니다. – HackedByChinese

+0

@HackedByChinese 절대적으로; 모든 사람들은 시리 나이저에 맞는 DTO (/ ViewModel) 표현을 선택하면 덜 복잡하고 (아마도 코드가 적을 때) 특정 serializer와 정렬되도록 노력하는 모델을 가진 사람들을 너무 자주 만난다. *. –

+0

XAML을위한 흥미로운 VS 추가 기능을 찾았지만 기존 클래스에서 뷰 모델/dto를 생성하는 기능이 있습니다. 좋은. http://karlshifflett.wordpress.com/xaml-power-toys/#FeatureSet – HackedByChinese