2011-01-08 6 views
-1

Nehmen wir an, ich habe ein Fenster, das 3 Modell auf der Client-Seite (Silverlight Client Application) einreichen sollte. Mein Problem ist jedes Mal, wenn ich das Formular absende, Daten auf der Serverseite, die ich ihnen vom Klienten gab, sind leer.Wie mehrere Parameter in DomainService übergeben werden - WCF

Ich habe eine geschachtelte Klasse verwendet, die meine Modelle enthält, anstatt mehrere Objekte als Parameter zu übergeben, aber es hat nicht wieder funktioniert.

Mein Personal Data Transfer Object-Code ist so etwas wie dieses:

[DataContract] 
public class PersonnelDTO : EntityObject 
{ 
    [Key] 
    [DataMember] 
    public int PersonnelId { get; set; } 

    [Include] 
    [DataMember] 
    [Association("Personnel_ID", "PersonnelId", "Personnel_ID")] 
    public Personnel Personnel { get; set; } 

    [Include] 
    [DataMember] 
    [Association("Personnel_Info_ID", "PersonnelId", "Personnel_Info_ID")] 
    public Personnel_Info PersonnelInfo { get; set; } 
} 

ich dieses Modell aufzufüllen, um Daten vom Client zum Server übergeben (DomainService). und auch Service-Code meine Domain ist:

[Invoke] 
    public void AddPersonnel(PersonnelDTO personnelDTO) 
    { 
     // Model are EMPTY in DTO 
     ObjectContext.AddToPersonnels(personnelDTO.Personnel); 
     ObjectContext.AddToPersonnel_Info(personnelDTO.PersonnelInfo); 
     ObjectContext.SaveChanges(); 
    } 

Ich weiß nicht, ob es einen Weg gibt mehrere Parameter in WCF-Service-Methode umfassen allgemeine Liste zu übergeben.

Vielen Dank im Voraus.

+0

Haben Sie die Methode bereits auf dem DomainService? Könnten Sie uns eine Probe von dem geben, was Sie schon gemacht haben? Dies würde das Problem, das Sie gegenüber potenziellen Menschen, die sich helfen möchten deutlicher ... – scartag

Antwort

2

Zunächst einmal möchten Sie Invoke auf Ihre Service-Methode nicht verwenden. Sie möchten nur eine Einfügen-Operation. So sollte Ihre Methode wie folgt aussehen:

public void InsertPersonnel(PersonnellDTO personnelDTO) 

Keine Notwendigkeit für einen [Insert] Attribut als RIA wird es automatisch durch Konvention der Namensgebung des Verfahrens erzeugen.

Die nächste Hürde, mit der Sie umgehen müssen, ist, wie RIA die Schlüssel behandelt. Es verwendet die Schlüssel, um Änderungsverfolgung zu bestimmen. Mit DEFAULT - RIA sendet EMPTY-Objekte an die Service-Schicht, wenn es denkt, dass das Objekt, das Sie senden, NICHT NEU ist. Das spart Bandbreite.

Sie verpacken Ihre Objekte in einem DTO; RIA verhält sich in diesem Szenario meiner Erfahrung nach nicht wirklich gut. Was es wirklich erwartet, ist ein Personal-Objekt mit dem Objekt PersonalInfo als Kind und der PersonalId als Schlüssel. Dann müssen Sie Ihre Verknüpfungen mit IsForeignKey = true einrichten, damit die Schlüssel korrekt aktualisiert werden.

Ich werde ein Beispiel für ein komplexes root-Aggregatobjekt veröffentlichen, das ich in einer Beispielanwendung verwende, über die ich in Kürze bloggen werde (wir verwenden RIA mit POCO und Oracle und es funktioniert; aber es hat einige gebraucht herausfinden).

[MetadataType(typeof (TicketMetadata))] 
    public partial class Ticket 
    { 
    internal sealed class TicketMetadata 
    { 
     [Key] public int TicketId; 

     [Required] 
     public DateTime IncidentDate; 

     [Required(ErrorMessage = "Missing Customer")] 
     public int CustomerId; 

     [Required(ErrorMessage = "Missing Product")] 
     public int ProductId; 

     [Include] 
     [Association("Ticket_Customer", "CustomerId", "CustomerId", IsForeignKey = true)] 
     public Customer Customer; 

     [Include] 
     [Association("Ticket_Product", "ProductId", "ProductId", IsForeignKey = true)] 
     public Product Product; 

     [Include] 
     [Composition] 
     [Association("Ticket_TicketActions", "TicketId", "TicketId")] 
     public List<TicketAction> TicketActions; 
    } 
    } 

Ich würde empfehlen, auf dem Weg Verband suchen und Fremdschlüssel arbeiten und Ihre Objektstruktur zu überdenken und möglicherweise sich von der DTO entfernt. Richtig gemacht, das Ganze funktioniert ganz gut.

+0

Vielen Dank lieber Chris für die Antwort, ich werde es testen. Danke noch einmal. – saber