2011-09-21 10 views
12

Ho una classe come mostrato di seguitocome serializzare proprietà di tipo ICollection <T> durante l'utilizzo di 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; } 
    } 

Il codice di cui sopra mi dà seguente eccezione

Impossibile serializzare membro 'SurveyGenerator.Survey. Domande 'di tipo ' System.Collections.Generic.ICollection

Quando converto ICollection per elencare serializza correttamente

Dal momento che è POCO di Entity Framework, non posso convertire ICollection to List

+0

Controllare se quella risposta vi aiuterà a http: // StackOverflow.it/a/21660262/1488939 –

+0

Cosa succede se si utilizza l'Elenco anziché ICollection con il codice EF prima? Avevo l'impressione che funzionasse ancora. – CDeutsch

risposta

2

Dagli sguardi di tua classe delle proprietà ICollection stanno definendo relazioni di chiave esterna? Se è così, non vorrai esporre pubblicamente le collezioni.

Per esempio: se si sta seguendo la guida alle best practice per lo sviluppo di modelli di Entity Framework, allora si avrebbe una classe separata denominata "domanda" che avrebbe cablare la vostra classe due insieme che potrebbe essere simile al seguente:

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; } 
} 

Se questo fosse il caso, si potrebbe molto probabilmente andare in tondo chiamando il Question -> Sondaggio -> ICollection -> domanda

ho avuto un incidente simile con EF, MVC3 per implementare un servizio REST e couldn serializzare l'oggetto ICollection <> quindi mi sono reso conto che non avevo bisogno di chiamerei comunque l'oggetto separatamente.

La classe aggiornati per i vostri scopi sarebbe simile a questa:

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; } 
} 

I spera che questo ti aiuta.

+1

Questo articolo mi ha aggiunto a questa risposta http://geekswithblogs.net/danemorgridge/archive/2010/05/04/entity-framework-4-wcf-amp-lazy-loading-tip.aspx –

1

Modificare il ICollection <T> a una lista di <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

Se non ti dispiace l'aggiunta di un riferimento al System.Runtime.Serialization assieme, è possibile utilizzare questo codice che serializzerà un oggetto con ICollection senza bisogno di modificare l'implementazione dell'oggetto. Il codice qui sotto è in uscita in stringa. Puoi utilizzare lo stream come preferisci.

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

Ho usato Matthew Merryfull soluzione e funziona.

Poiché utilizzo il progettista EF per la generazione di entità ogni volta che aggiorno i miei modelli perderei le modifiche manuali. Ho dovuto cambiare * .tt che è usato per la generazione di modelli. Ho modificato poche righe:

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)); 
} 

controllare anche questo articolo nel caso in cui si esegue in problemi con la serializzazione http://geekswithblogs.net/danemorgridge/archive/2010/05/04/entity-framework-4-wcf-amp-lazy-loading-tip.aspx

Problemi correlati