2010-12-08 11 views
3

Ich habe einen WCF-Dienst, in dem ich einige Datenverträge habe. Ich benutze Web-Service-Software Factory, die einen Designer verwendet, um alle Nachrichten und Daten und andere Verträge zu erstellen, und es erstellt sie als Teilklassen. Wenn der Code neu generiert wird, werden die Klassen neu erstellt.C# WCF Datenvertrag Teilklasse - neues Feld in 2. Teilklasse wird nicht abgeholt

using WcfSerialization = global::System.Runtime.Serialization; 

[WcfSerialization::CollectionDataContract(Namespace = "urn:CAEService.DataContracts", ItemName = "SecurityItemCollection")] 
public partial class SecurityItemCollection : System.Collections.Generic.List<SecurityItem> 
{ 
} 

Der Datenvertrag ist eine generische Liste einer benutzerdefinierten Klasse, die einwandfrei funktionierte. Allerdings möchte ich jetzt eine Eigenschaft dieser Klasse hinzuzufügen, so dass ich hinzugefügt, um diese partielle Klasse im gleichen Namensraum:

public partial class SecurityItemCollection 
{ 
    public int TotalRecords { get; set; } 
} 

Dies scheint auf der Serviceseite gut zu funktionieren, aber wenn ich kompilieren und dann den Dienstverweis aktualisieren vom Client hat die Klasse nicht die neue Eigenschaft, dh wenn sie serialisiert und auf der Clientseite neu erstellt wird, fehlt die neue Eigenschaft. Wer weiß, warum das so ist?

TIA

EDIT: Ok dies offiziell treibt mich Nüsse. Das einzige, was ich sehen kann, ist, dass es das CollectionDataContract-Attribut anstelle von DataContract verwendet. Können Datenelemente in der Klasse dadurch nicht serialisiert werden? Warum sollte das sein? Es funktioniert gut auf der Service-Seite - ich kann sehen und bevölkern die Werte kein Problem. Wenn ich jedoch die Service-Referenz auf meinem Client aktualisiere, gibt es nichts, nur die Colection-Klasse ohne das Datenelement.

+0

Was passiert, wenn Sie das Attribut "[DataContract]" auf die neue Eigenschaft setzen und dann Ihren Proxy neu generieren? – slugster

+0

Hallo slugster - Ich habe versucht, das gleiche Attribut wie die 1. Klasse und ich habe einen Fehler: Duplicate 'WcfSerialization :: CollectionDataContract' Attribut C: \ xxx \ CAEService.DataContracts \ SecurityItemCollection.cs –

+0

Ich habe auch versucht, eine normale [DataContract] -Attribut zu der 2. Klasse, die kompiliert, aber ich habe einen Fehler, wenn ich den Dienst veröffentlicht: Geben Sie 'CAEService.DataContracts.SecurityItemCollection' mit CollectionDataContractAttribute Attribut ist eine ungültige Sammlung Typ seit es DataContractAttribute Attribut –

Antwort

3

Ok nach langem Suchen endlich fand ich, dass dies nicht das heißt Klassen markiert als CollectionDataContract darf keine Daten Mitglieder haben. Warum das ist, habe ich keine Ahnung, aber es kostete mich mehrere Stunden und große Kopfschmerzen. Siehe Link unten:

WCF CollectionDataContract and DataMember

3

Versuchen Sie, fügen Sie den Datamember zu den Attribut Eigenschaft totalrecords

+0

Yep versuchte es keine Freude –

+0

Sind Sie sicher, die beiden Teilklassen befinden sich im selben Namespace? Um dies zu überprüfen, entfernen Sie das partielle Schlüsselwort aus einer der Klassen und kompilieren Sie es. Wenn es nicht abstürzt, befinden sie sich nicht im selben Namespace. –

+0

Ja bin ich sicher. Anscheinend sind Datenmammler in Klassen, die als CollectionDataContract markiert sind, nicht erlaubt ... siehe meine Antwort oben. –

2

Ich weiß, das ist alt, aber es kam immer, wenn ich zu diesem Thema gesucht. Ich konnte dies erreichen, indem ich der Eigenschaft ein "DataMemberAttribute" -Attribut hinzufügte. Unten ist ein Codebeispiel.

public partial class SecurityItemCollection 
{ 
    [global::System.Runtime.Serialization.DataMemberAttribute()] 
    public int TotalRecords { get; set; } 

} 
Verwandte Themen