DTO и WCF RIA

У меня есть DTO, в котором есть коллекция другого DTO, которую я заполняю на стороне сервера и отправляю клиенту. Однако эта внутренняя коллекция DTO не возвращается клиенту.

Я считаю, что мне нужно использовать атрибуты [Include] и [Association], чтобы службы WCF RIA знали, что делать, однако моя проблема с этим заключается в том, что между основным DTO и внутренней коллекцией DTO нет реальной связи, я просто используя его для агрегирования данных из различных источников для возврата клиенту.

Я неправильно понимаю, чего я пытаюсь достичь, если нет, то как мне заставить WCF RIA отправить эту внутреннюю коллекцию DTO.

Я должен добавить, что я использую automapper и хочу добиться этого с помощью такого.

Вот пример, я хочу отправить обратно клиенту одним фрагментом;

  1. Компетенции, которыми обладает сотрудник.
  2. Компетенции, необходимые работнику для работы.
  3. GAP, который представляет собой разницу между 1 и 2.
public class CompetencyRequirementsDto
{
    [Key]
    public string CompanyId { get; set; }
    [Key]
    public string EmployeeNo { get; set; }

    public string JobId { get; set; }

    [Include]
    [Association("EmployeeCompetencies","CompanyId, EmployeeNo","CompanyId, EmployeeNo")]
    public IList<EmployeeCompetencyDto> EmployeeCompetencies { get; set; }
    [Include]
    [Association("JobCompetencies","JobId, CompanyId","JobId, CompanyId")]
    public IList<JobCompetencyDto> JobCompetencies { get; set; }
    [Include]
    [Association("CompetencyGap", "JobId, CompanyId", "JobId, CompanyId")]
    public IList<JobCompetencyDto> CompetencyGap { get; set; }
} }

Теперь пункт 1 работает нормально, а 2 и 3 нет? Я обнаружил, что мой DTO создан на стороне сервера, но когда он доходит до клиента CompetencyGap (даже если он не имеет значений), ему присваиваются значения JobCompetencies.


person David    schedule 28.08.2011    source источник
comment
возможно, если вы включили какой-то код? Вы сгенерировали сервисы ria или написали их сами? Вы использовали linq2sql или структуру сущностей?   -  person Geoff    schedule 11.10.2011
comment
Сервисы ria были сгенерированы с небольшим количеством ручной работы, это скорее общий вопрос о том, как использовать DTO с RIA в истинном смысле DTO, то есть ведро данных, где данные внутри не обязательно все связаны, но насколько я вижу, любой внутренний DTO должен быть связан с родительским DTO. Спасибо.   -  person David    schedule 12.10.2011
comment
Можете ли вы показать какой-либо код? Возможно, попробуйте воспроизвести проблему с более простым набором объектов DTO и вставьте это?   -  person Dave Walker    schedule 12.10.2011
comment
Я все еще в замешательстве. Зачем нужна собственная коллекция DTO? Почему бы не вернуть IQueryable‹myDTO› или List‹myDTO›? Как выглядит ваш запрос для получения данных из базы данных?   -  person Geoff    schedule 12.10.2011
comment
Можете ли вы предоставить метод запроса доменной службы, который возвращает данные   -  person Jehof    schedule 13.10.2011


Ответы (1)


Если вы используете модель данных ADO.Net Entity и используете службы RIA для них, у вас есть возможность создать связанные метаданные.

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

Here I am giving an example...

1. Just add [Include] attribute at the the top of  the referenced data for example.

[MetadataTypeAttribute(typeof(Customer.CustomerMetadata))]
    public partial class Customer
    {

        // This class allows you to attach custom attributes to properties
        // of the Customer class.
        //
        // For example, the following marks the Xyz property as a
        // required property and specifies the format for valid values:
        //    [Required]
        //    [RegularExpression("[A-Z][A-Za-z0-9]*")]
        //    [StringLength(32)]
        //    public string Xyz { get; set; }
        internal sealed class CustomerMetadata
        {

            // Metadata classes are not meant to be instantiated.
            private CustomerMetadata()
            {
            }

            public int CustomerID { get; set; }

            public string EmailAddress { get; set; }

            public string FullName { get; set; }

            [Include]
            public EntityCollection<Order> Orders { get; set; }

            public string Password { get; set; }
        }
    }


2. Modify the function in the domain service and add include there also for example. 

     public IQueryable<Customer> GetCustomers()
        {
             var res = this.ObjectContext.Customers.Include("Orders");
             return res;
        }

  In your case the first part is done you just need to modify your domain service query to get reference entities.
person himanshu    schedule 17.10.2011