2010-04-09 1 views
4

У меня есть службы WCF на RIA домен, содержащий метод я хотел бы, чтобы вызвать, когда пользователь нажимает на кнопку:Метод доменной службы не компилируется; претензии «типы возвращаемых значений должны быть объектом ...»

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

Однако, когда я пытаюсь компилировать я дал следующее сообщение об ошибке:

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. 

дело в том, насколько я могу судить, MyEntity является сущность:

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

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

Я полагаю, что мне не хватает чего-то простого здесь. Может кто-нибудь, пожалуйста, скажите мне, как я могу создать invokable метод, который возвращает один объект MyEntity?

ответ

2

На этот вопрос был отправлен YasserMohamedMCTS на Silverlight Forum.

+0

Ссылки не работают. – gius

+0

Спасибо, я обновил их до ссылок web.archive.org. –

-1

создать свой собственный класс в стороне проекте сервера, как:

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

добавить свой метод к вашему DomainService в стороне проекте сервера, как:

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

добавить этот код к одному из вашей страницы на клиенте сторонний проект

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

просто добавить [Query] attribut e поверх метода вызова.

4

код, который вы здесь:

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

это хорошо, но вы также должны IEnumerable, чтобы сделать эту работу:

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

Что это означает, что для WCF RIA службы, чтобы вернуться пользовательские типы должны иметь по крайней мере один метод для этого настраиваемого типа, который возвращает IEnumerable этого типа.

0

Иногда вам нужно вынуть конструктор классов, и он будет компилироваться без ошибок.

Вот образец, который компилируется правильно.

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) 
     { 
       ....  
     }