2011-08-28 76 views
2

我有一個DTO這裏面出現一個集合另一個DTO我填充服務器端和客戶端發送的。但是,這個內部DTO集合不會返回給客戶端。的DTO和WCF RIA

我相信我需要使用[Include]和[Association]屬性,以便WCF RIA服務知道該怎麼做,但是我的問題是在主DTO和內部DTO之間沒有真正的關聯收集,我只是用它來彙總來自各種來源的數據以返回給客戶端。

我的理解錯誤,我試圖實現,如果不是我如何獲得WCF RIA發送這個內部的DTO集合。

我應該補充說我正在使用automapper,並希望使用它來實現它。

這裏是一個例子,我想在一個塊中發送回客戶端;

  1. 員工擁有的能力。
  2. 該僱員需要他們的工作能力。
  3. 的差距,這是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值。

+0

也許如果你包含一些代碼?您是否創建了ria服務或自己編寫它們?你使用linq2sql或實體框架? – Geoff

+0

ria服務已經產生了一些手工製作,這更像是一個關於如何在真正的DTO中使用DTO和RIA的一般問題,也就是一個數據桶,其中的數據並不一定都是相關的,但據我所看到的任何內部DTO需要與父DTO相關。謝謝。 – David

+0

你能表現出任何的代碼?也許嘗試用更簡單的DTO對象複製問題並粘貼它? –

回答

0

如果您使用ADO.Net實體數據模型並針對它們使用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.