Метод службы домена не компилируется; утверждения Типы возвращаемых значений должны быть сущностью

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


person Duncan Bayne    schedule 09.04.2010    source источник


Ответы (5)


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

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

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

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

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

person bleepzter    schedule 14.09.2011

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

person Duncan Bayne    schedule 29.04.2010

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

person user695663    schedule 09.06.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)
        {
              ....    
        } 
person DmitryBoyko    schedule 22.12.2011

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

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

}
person Pouya Shayan Arani    schedule 06.10.2010