Альтернатива использованию объекта в качестве параметра для метода вызова в службах RIA WCF - PullRequest
7 голосов
/ 23 ноября 2010

Привет, ты! Первый вопрос по StackOverflow! : -)

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

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

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

Эти классы успешно генерируются в проекте Silverlight. SerializableResult не имеет ключа , а не .

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

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

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

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

Ответ Джеффа:

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

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

Большое спасибо!

Ответы [ 2 ]

8 голосов
/ 23 ноября 2010

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

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; }
    }
}
6 голосов
/ 24 ноября 2010

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

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

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

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

...