Альтернатива использованию сущности в качестве параметра метода Invoke в службах WCF RIA

Привет, я буду! Первый вопрос на StackOverflow! :-)

Итак, вот сценарий: мы работаем над веб-приложением с Silverlight 4 и используем бета-версию WCF RIA Services 1.0 SP1 для веб-службы. У меня есть мои сущности в конструкторе Entity Framework, но я использую слегка измененный ADO.NET шаблон генератора сущностей C# POCO для создания классов.

то, что я хотел бы сделать, это иметь метод внутри доменной службы со следующим подпись:

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

Я возвращаю EntityOne и EntityTwo клиенту через запросы в других службах, например:

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

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

классы are успешно генерируется в проекте Silverlight. В SerializableResult делает не есть ключ.

когда я пытаюсь скомпилировать, я получаю следующую ошибку: "операция с именем "CalculateResult" не соответствует требуемой подписи. Типы параметров должны быть сущность или сложный тип, коллекция сложных типов или один из предопределенных сериализуемых типов."

в моем исследовании самая полезная информация, которую я нашел, была в комментариях этот пост Джеффа Хэндли.

примечательно, что Петр спросил в комментарии:

Я получил не соответствует требуемой подписи ...'ошибка компиляции, если мой сложный объект имеет атрибут [Key]. Когда я удаляю этот атрибут, я могу использовать объект как параметр для операции вызова.

Джефф:

это дизайн. Сложные объекты не могут иметь свойства. Если у вас есть ключ, класс обрабатывается как сущность.

таким образом, похоже, что любые дальнейшие усилия, чтобы попытаться заставить мой метод работать, будут тщетными. Однако мне было интересно, сталкивался ли кто-нибудь еще с этой проблемой и что они сделали, чтобы ее решить.

спасибо!

2 ответов


У меня есть следующее, И это работает для меня.

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

Большое Спасибо Г-Ну Джеффу Хэндли и Г-Ну Динешу Кулкарни за ответ (через Твиттер).

для того, чтобы сущность использовалась в качестве параметра в методе invoke, эта сущность должна быть представлена через метод запроса, существующий в том же DomainService. Намерение этого ограничения заключается в том, что

" каждая доменная служба должна быть в состоянии стоять самостоятельно."

путем добавления двух фиктивных методов запроса (см. Джеффа ответ для примера), я смог скомпилировать свой код.