2010-11-23 4 views
7

Hallo, ya'll! Erste Frage zu StackOverflow! :-)Alternative zur Verwendung einer Entität als Parameter für eine Aufrrichtmethode in WCF RIA Services

Also hier ist das Szenario: Wir arbeiten an einer Webanwendung mit Silverlight 4 und WCF RIA Services 1.0 SP1 Beta für den Webdienst verwenden. Ich habe meine Entitäten im Entity Framework Designer, verwende aber eine leicht modifizierte ADO.NET C# POCO Entity Generator-Vorlage, um die Klassen zu generieren.

Was würde ich tun möchte, ist ein Verfahren in einem Domain-Service hat mit der folgenden Signatur:

[EnableClientAccess] 
public class ResultService : DomainService 
{ 
    [Invoke] 
    public SerializableResult CalculateResult(EntityOne e1, EntityTwo e2); 
} 

ich beide EntityOne und EntityTwo an den Client durch Abfragen in anderen Diensten kehre zurück, etwa so:

[EnableClientAccess] 
public class EntityOneService : DomainService 
{ 
    public IQueryable<EntityOne> GetEntityOnes(); 
} 

[EnableClientAccess] 
public class EntityOneService : DomainService 
{ 
    public IQueryable<EntityTwo> GetEntityTwos(); 
} 

Diese Klassen sind erfolgreich in der Silverlight-Projekt erzeugt werden. Das SerializableResult hat nicht einen Schlüssel.

Wenn ich versuche, zu kompilieren, erhalte ich den folgenden Fehler: "Operation mit dem Namen 'CalculateResult' entspricht nicht der erforderlichen Signatur. Parametertypen müssen eine Entität oder ein komplexer Typ, eine Sammlung komplexer Typen oder einer der sein vordefinierte serialisierbare Typen. "

In meiner Recherche fand ich die hilfreichsten Informationen in den Kommentaren this post by Jeff Handley.

Bemerken, fragte Peter in einem Kommentar:

I get an 'does not conform to the required signature ...' compile error if my complex object has an [Key] Attribute. When I remove this attribute I can use the object as parameter for an Invoke operation.

Jeffs Antwort:

This is by design. Complex objects cannot have Key properties. If you have a Key the class gets treated as an Entity.

So klingt es, als ob noch weitere Anstrengungen, um zu versuchen, meine Methode zu bekommen zu arbeiten vergeblich sein. Ich habe mich jedoch gefragt, ob jemand anderes auf dieses Problem gestoßen ist und was sie getan haben, um es zu lösen.

Vielen Dank!

+0

Wird SerializableResult auf dem Client generiert? Ich frage mich, ob dies ein Fehler in unserer Complex Type-Identifikation ist, wo wir möglicherweise den SerializableResult-Typ als Eigenschaft auf einer Entity auftauchen müssen, bevor er als Invoke-Ergebnis verwendet werden kann. –

+0

Wenn ich versuche: "[Invoke] public SerializableResult CalculateResult();", SerializableResult _is_ wird auf dem Client generiert. –

+0

Dann klingt es wie etwas mit den Formen Ihrer Entitäten. Werden EntityOne und EntityTwo als Entity generiert? –

Antwort

6

Vielen Dank an Herrn Jeff Handley und Herr Dinesh Kulkarni für die Antwort (durch Twitter).

Damit eine Entität als Parameter in einer Aufrufmethode verwendet werden kann, muss diese Entität über eine im gleichen DomainService vorhandene Abfrage-Methode verfügbar gemacht werden. Die Intention für diese Einschränkung ist, dass

"Each domain service needs to be able to stand on its own."

Durch die Zugabe von zwei Dummy-Query-Methoden (Jeffs Antwort für ein Beispiel sehen), konnte ich meinen Code kompilieren.

8

Ich habe folgendes und es funktioniert für mich.

namespace BusinessApplication2.Web 
{ 
    using System.ComponentModel.DataAnnotations; 
    using System.Linq; 
    using System.ServiceModel.DomainServices.Hosting; 
    using System.ServiceModel.DomainServices.Server; 

    [EnableClientAccess()] 
    public class DomainService1 : DomainService 
    { 
     public IQueryable<EntityOne> GetEntityOnes() 
     { 
      return null; 
     } 

     public IQueryable<EntityTwo> GetEntityTwos() 
     { 
      return null; 
     } 

     [Invoke] 
     public SerializableResult GetSerializableResult(EntityOne one, EntityTwo two) 
     { 
      return new SerializableResult() { Result = "It woooooorrrked!" }; 
     } 
    } 

    public class EntityOne 
    { 
     [Key] 
     public int Id { get; set; } 
    } 

    public class EntityTwo 
    { 
     [Key] 
     public int Id { get; set; } 
    } 

    public class SerializableResult 
    { 
     public string Result { get; set; } 
    } 
} 
+0

Also habe ich zwei Dummy-Abfrage-Methoden in der DomainService (Rückgabe IQueryable und IQueryable ) _alongside_ die CalculateResult-Methode, und es kompiliert jetzt! Warum sollte es nicht den ursprünglichen Weg kompilieren? –

+0

Dies könnte ein Fehler in unserer Funktion "Gemeinsame Entitäten" sein, mit dem Sie mit Entitätstypen über Domänendienste hinweg arbeiten können. Ich werde es ablegen und Sie wissen lassen, ob es sich um einen Entwurf oder um einen Fehler handelt. –

+0

Vielen Dank! –