2010-04-09 4 views
4

J'ai un WCF RIA service de domaine qui contient une méthode que je voudrais invoquer lorsque l'utilisateur clique sur un bouton:Domaine Méthode de service ne compilant pas; réclamations « Types de retour doit être une entité ... »

[Invoke] 
public MyEntity PerformAnalysis(int someId) 
{ 
    return new MyEntity(); 
} 

Cependant, lorsque je tente compiler Je me donne l'erreur suivante:

Operation named 'PerformAnalysis' does not conform to the required signature. 
Return types must be an entity, collection of entities, or one of the 
predefined serializable types. 

la chose est, pour autant que je peux dire, MyEntity est une entité:

[Serializable] 
public class MyEntity: EntityObject, IMyEntity 
{ 
    [Key] 
    [DataMember] 
    [Editable(false)] 
    public int DummyKey { get; set; } 

    [DataMember] 
    [Editable(false)] 
    public IEnumerable<SomeOtherEntity> Children { get; set; } 
} 

Je me dis qu'il me manque quelque chose de simple ici. Quelqu'un pourrait-il me dire comment je peux créer une méthode invocable qui retourne un seul objet MyEntity?

Répondre

2

YasserMohamedMCTS a répondu à cette question sur le Silverlight Forum.

+0

Les liens ne fonctionnent pas. – gius

+0

Merci, je les ai mis à jour aux liens web.archive.org. –

-1

Créez votre propre classe dans le projet côté serveur comme:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Runtime.Serialization; 
using System.ComponentModel.DataAnnotations; 
using System.Data.Objects.DataClasses; 

namespace yournamespace 
{ 
    [DataContract]  
    public class Custom : EntityObject 
    { 

     [DataMember()] 
     [Key()] 
     public int id { set; get; } 

     [DataMember()] 
     public string name { set; get; } 

     public Custom() 
     { 
      name = "Pouya"; 
     } 
    } 
} 

ajoutez votre méthode à votre DomainService dans le projet côté serveur comme:

public Custom GetCustom() 
    { 
     return new Custom(); 
    } 

ajouter ces codes à l'un de votre page au client side project

public partial class Admin : Page 
{ 
    LoadOperation<Custom> operation; 
    Custom ali = new Custom(); 
    public Admin() 
    { 
     InitializeComponent(); 
    } 

    // Executes when the user navigates to this page. 
    protected override void OnNavigatedTo(NavigationEventArgs e) 
    { 
     operation = DomainContext.Load(DomainContext.GetCustomQuery());    
     operation.Completed += new EventHandler(operation_Completed); 
    } 

    void operation_Completed(object sender, EventArgs e) 
    { 
     if (!operation.HasError) 
     { 
      ali = operation.Entities.FirstOrDefault(); 
     }    
    } 

} 
1

simplement ajouter [Recherche] attribut e au-dessus de la méthode invoke.

4

Le code que vous avez ici:

[Invoke] 
public MyEntity PerformAnalysis(int someId) 
{ 
    return new MyEntity(); 
} 

est très bien, mais vous avez aussi besoin d'un IEnumerable pour faire ce travail:

public IEnumerable<MyEntity> GetMyEntities() 
{ 
    throw new NotImplementedException(); 
} 

Cela signifie que pour le service WCF RIA pour revenir types personnalisés il doit avoir au moins une méthode pour ce type personnalisé qui retourne un IEnumerable de ce type.

0

Parfois, vous devez sortir un constructeur de classe et il compilera sans erreurs.

Voici un exemple qui compile correctement.

public class PluginControlCommandView 
    { 
     public Nullable<DateTime> CreationTime { get; set; } 

     public string Description { get; set; } 

     public Nullable<Guid> PlayerControlCommandID { get; set; } 

     public Nullable<Guid> EventFramePluginID { get; set; } 

     public Nullable<DateTime> ExecutionTime { get; set; } 

     public Nullable<Guid> ID { get; set; } 

     public Nullable<bool> IsConsole { get; set; } 

     public Nullable<bool> IsExecuted { get; set; } 

     public PluginCommands PluginCommand { get; set; } 
     // !!! You can see that here is a IEnumerable! :) 
     public IEnumerable<PluginCommandDetailView> PluginCommandDetails { get; set; } 

     public PluginStates PluginState { get; set; } 
    } 


     [Invoke] 

     public void UpdatePluginControlCommandView(PluginControlCommandView commandView) 
     { 
       ....  
     }