2011-09-21 12 views
12

Mam klasy jak pokazano poniżejJak Serializować właściwość typu kolekcji ICollection <T> podczas korzystania z Entity Framework

public class Survey 
    { 
     public Survey() 
     { 
      SurveyResponses=new List<SurveyResponse>(); 
     } 

     [Key] 
     public Guid SurveyId { get; set; } 
     public string SurveyName { get; set; } 
     public string SurveyDescription { get; set; } 
     public virtual ICollection<Question> Questions { get; set; } 
     public virtual ICollection<SurveyResponse> SurveyResponses { get; set; } 
    } 

Powyższy kod daje mi następujący wyjątek

SurveyGenerator.Survey Nie można szeregować członkowskiego”. Pytania "typu " System.Collections.Generic.ICollection

Po konwersji ICollection do listy to serializes prawidłowo

Ponieważ jest POCO z Entity Framework, nie mogę przekonwertować kolekcji ICollection do listy

+0

Sprawdź, czy ta odpowiedź cię http pomóc: // stackoverflow.com/a/21660262/1488939 –

+0

Co się stanie, jeśli zamiast listy ICollection zamiast kodu ICol zostanie najpierw użyty kod EF? Miałem wrażenie, że wciąż działa. – CDeutsch

Odpowiedz

2

od spojrzeń swojej klasie właściwości ICollection definiowanej relacji klucza obcego? Jeśli tak, nie chciałbyś publicznie ujawniać kolekcji.

Na przykład: Jeśli podążasz Dobrych Praktyk przewodnik dla opracowania modeli Entity Framework, wtedy masz osobną klasę o nazwie „Pytanie” co podłączać swoje dwie klasy razem, co może wyglądać następująco:

public class Question 
{ 
    [Key] 
    public int Id { get; set; } 
    public string Title { get; set; } 
    public string Description { get; set; } 

    public virtual Survey Survey { get; set; } 
} 

Jeśli tak było, można było być może kręcić się w kółko wywołując pytanie -> Survey -> ICollection -> Pytanie

miałem podobny incydent przy użyciu EF MVC3 wdrożyć usługę odpoczynku i mogłem serializuje obiekt ICollection <>, a następnie zdałam sobie sprawę, że nie muszę tego robić osobno i tak nazywałbym obiekt osobno.

Zaktualizowana klasa dla swoich celów będzie wyglądać następująco:

public class Survey 
{ 
    public Survey() 
    { 
     SurveyResponses=new List<SurveyResponse>(); 
    } 

    [Key] 
    public Guid SurveyId { get; set; } 
    public string SurveyName { get; set; } 
    public string SurveyDescription { get; set; } 

    [XmlIgnore] 
    [IgnoreDataMember] 
    public virtual ICollection<Question> Questions { get; set; } 

    [XmlIgnore] 
    [IgnoreDataMember] 
    public virtual ICollection<SurveyResponse> SurveyResponses { get; set; } 
} 

Mam nadzieję, że to pomoże Ci się.

+1

Ten artykuł przekuli mnie w połączeniu z tą odpowiedzią http://geekswithblogs.net/danemorgridge/archive/2010/05/04/entity-framework-4-wcf-amp-lazy-loading-tip.aspx –

1

Zmiana ICollection <T> do listy <T>

public class Survey 
{ 
    public Survey() 
    { 
     SurveyResponses=new List<SurveyResponse>(); 
    } 

    [Key] 
    public Guid SurveyId { get; set; } 
    public string SurveyName { get; set; } 
    public string SurveyDescription { get; set; } 
    public virtual List<Question> Questions { get; set; } 
    public virtual List<SurveyResponse> SurveyResponses { get; set; } 
} 
1

Jeśli nie przeszkadza dodanie odniesienia do System.Runtime.Serialization montażowej, można wykorzystać ten kod które serializuje obiekt za pomocą ICollection bez konieczności zmiany implementacji obiektu. Poniższy kod wypisuje łańcuch. Możesz korzystać ze strumienia w dowolny sposób.

private string ConvertClassToXMLString<T>(T classObject) 
    { 
     using (var stream = new MemoryStream()) 
     { 
      var serializer = new DataContractSerializer(classObject.GetType()); 
      serializer.WriteObject(stream, classObject); 

      return Encoding.UTF8.GetString(stream.ToArray()); 
     } 
    } 
0

Użyłem rozwiązania Matthew Merryfull i działa.

Ponieważ używam kreatora EF do generowania jednostek, za każdym razem, gdy aktualizuję swoje modele, tracę ręczne zmiany. Musiałem zmienić * .tt, który jest używany do generowania modeli. I edytowane kilka wierszy:

public string NavigationProperty(NavigationProperty navigationProperty) 
{ 
var enbleWebService = string.Empty; 
if(navigationProperty.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many){ 
enbleWebService = string.Format("[XmlIgnore]{0}[IgnoreDataMember]{0}", Environment.NewLine); 
} 
    var endType = _typeMapper.GetTypeName(navigationProperty.ToEndMember.GetEntityType()); 
    return string.Format(
     CultureInfo.InvariantCulture, 
     "{5} {0} {1} {2} {{ {3}get; {4}set; }}", 
     AccessibilityAndVirtual(Accessibility.ForProperty(navigationProperty)), 
     navigationProperty.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many ? ("ICollection<" + endType + ">") : endType, 
     _code.Escape(navigationProperty), 
     _code.SpaceAfter(Accessibility.ForGetter(navigationProperty)), 
     _code.SpaceAfter(Accessibility.ForSetter(navigationProperty)), 
     _code.Escape(enbleWebService)); 
} 

public string NavigationProperty(NavigationProperty navigationProperty) 
{ 
var enbleWebService = string.Empty; 
if(navigationProperty.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many){ 
    enbleWebService = string.Format("[XmlIgnore]{0}[IgnoreDataMember]{0}", Environment.NewLine); 
} 
    var endType = _typeMapper.GetTypeName(navigationProperty.ToEndMember.GetEntityType()); 
    return string.Format(
     CultureInfo.InvariantCulture, 
     "{5} {0} {1} {2} {{ {3}get; {4}set; }}", 
     AccessibilityAndVirtual(Accessibility.ForProperty(navigationProperty)), 
     navigationProperty.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many ? ("ICollection<" + endType + ">") : endType, 
     _code.Escape(navigationProperty), 
     _code.SpaceAfter(Accessibility.ForGetter(navigationProperty)), 
     _code.SpaceAfter(Accessibility.ForSetter(navigationProperty)), 
     _code.Escape(enbleWebService)); 
} 

również sprawdzić ten artykuł w przypadku napotkasz problem z serializacji http://geekswithblogs.net/danemorgridge/archive/2010/05/04/entity-framework-4-wcf-amp-lazy-loading-tip.aspx