Альтернатива использованию сущности в качестве параметра метода 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. Намерение этого ограничения заключается в том, что
" каждая доменная служба должна быть в состоянии стоять самостоятельно."
путем добавления двух фиктивных методов запроса (см. Джеффа ответ для примера), я смог скомпилировать свой код.