Метод доменной службы не компилируется; утверждает, что "типы возврата должны быть сущностью ..." - PullRequest
4 голосов
/ 09 апреля 2010

У меня есть доменная служба 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; }
}

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

Ответы [ 5 ]

5 голосов
/ 14 сентября 2011

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

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

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

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

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

2 голосов
/ 29 апреля 2010

YasserMohamedMCTS ответил на этот вопрос на форуме Silverlight .

1 голос
/ 09 июня 2011

просто добавь Атрибут [Query] поверх метода invoke.

0 голосов
/ 22 декабря 2011

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

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

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)
        {
              ....    
        } 
0 голосов
/ 06 октября 2010

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

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();
        }             
    }

}
...