Как передать несколько параметров в DomainService - WCF - PullRequest
0 голосов
/ 08 января 2011

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

Я использовал вложенный класс, содержащий мои модели, вместо передачи нескольких объектов в качестве параметра, но он снова не работал.

Код объекта передачи данных моего персонала выглядит примерно так:

[DataContract]
public class PersonnelDTO : EntityObject
{
    [Key]
    [DataMember]
    public int PersonnelId { get; set; }

    [Include]
    [DataMember]
    [Association("Personnel_ID", "PersonnelId", "Personnel_ID")]
    public Personnel Personnel { get; set; }

    [Include]
    [DataMember]
    [Association("Personnel_Info_ID", "PersonnelId", "Personnel_Info_ID")]
    public Personnel_Info PersonnelInfo { get; set; }
}

Я заполняю эту модель для передачи данных от клиента к серверу (DomainService). а также мой сервисный код домена:

    [Invoke]
    public void AddPersonnel(PersonnelDTO personnelDTO)
    {
        // Model are EMPTY in DTO
        ObjectContext.AddToPersonnels(personnelDTO.Personnel);
        ObjectContext.AddToPersonnel_Info(personnelDTO.PersonnelInfo);
        ObjectContext.SaveChanges();
    }

Я не знаю, есть ли способ передать несколько параметров в методе WCF Service, включая Общий список.

Заранее спасибо.

1 Ответ

2 голосов
/ 10 января 2011

Во-первых, вы не хотите использовать Invoke в вашем сервисном методе. Вы просто хотите операцию вставки. Итак, ваш метод должен выглядеть следующим образом:

public void InsertPersonnel(PersonnellDTO personnelDTO)

Нет необходимости в атрибуте [Insert], так как RIA автоматически сгенерирует его по соглашению с именами метода.

Следующее препятствие, с которым вам придется столкнуться, это то, как RIA обрабатывает ключи. Он использует ключи для определения отслеживания изменений. По DEFAULT - RIA отправит пустые объекты на сервисный уровень, если считает, что отправляемый вами объект НЕ НОВЫЙ. Это позволяет сэкономить трафик.

Вы оборачиваете свои объекты в DTO; По моему опыту, RIA не очень хорошо себя ведет в этом сценарии. Что он действительно ожидает, так это объект Personnel с объектом PersonnelInfo в качестве дочернего элемента и PersonnelId в качестве ключа. Затем вам нужно настроить ассоциации с IsForeignKey = true, чтобы ключи обновлялись правильно.

Я опубликую пример сложного корневого агрегатного объекта, который я использую в образце приложения, о котором я собираюсь вскоре написать в блоге (мы используем RIA с POCO и Oracle, и это работает; но это потребовало некоторого понимания из).

[MetadataType(typeof (TicketMetadata))]
  public partial class Ticket
  {
    internal sealed class TicketMetadata
    {
      [Key] public int TicketId;

      [Required]
      public DateTime IncidentDate;

      [Required(ErrorMessage = "Missing Customer")] 
      public int CustomerId;

      [Required(ErrorMessage = "Missing Product")] 
      public int ProductId; 

      [Include]
      [Association("Ticket_Customer", "CustomerId", "CustomerId", IsForeignKey = true)]
      public Customer Customer;

      [Include]
      [Association("Ticket_Product", "ProductId", "ProductId", IsForeignKey = true)]
      public Product Product;

      [Include]
      [Composition]
      [Association("Ticket_TicketActions", "TicketId", "TicketId")]
      public List<TicketAction> TicketActions;
    }
  }

Я бы рекомендовал посмотреть, как работают Ассоциация и внешние ключи, переосмыслить структуру вашего объекта и, возможно, отойти от DTO. Сделано правильно, все работает довольно хорошо.

...