2012-01-22 35 views
6

我的實體框架模型是從SQL Server數據庫生成的。由於我需要從Silverlight訪問數據庫,因此我爲EF模型生成了用於RIAServices的DomainService。 Product是對應於表Product的自動生成的EntityObject之一。我試圖將自定義類CompositeData傳遞給Silverlight客戶端,如圖所示。問題是CurrentProduct字段在客戶端不可訪問,但其他字符串/ int字段是可訪問的。如何從客戶端訪問CurrentProduct無法通過RIA服務訪問EntityObject類型

public class CompositeData 
{ 
    [Key] 
    public Guid PKey { get; set; } 
    public string CompositeName { get; set; } 
    public string Identity { get; set; } 
    public Product CurrentProduct { get; set; } //Product is an auto-generated EntityObject class 

    public CompositeData() 
    { 
     PKey = Guid.NewGuid(); 
    } 
} 

以下是域名服務方法:

[EnableClientAccess()] 
public class LocalDomainService : DomainService 
{ 
    public IEnumerable<CompositeData> GetData() 
    { 
     List<CompositeData> listData = new List<CompositeData>(); 
     //... 
     return listData; 
    } 
} 

從Silverlight客戶端,

domService.Load(domService.GetDataQuery(), GetDataCompleted, null); 

    private void GetDataCompleted(LoadOperation<CompositeData> compData) 
    { 
     foreach(CompositeData cdItem in compData.Entities) 
     { 
      // cdItem.CompositeName is accessible 
      // cdItem.CurrentProduct is not accessible! 
     }      
    } 

編輯: Product類是在Model1.Designer.cs

自動生成
[EdmEntityTypeAttribute(NamespaceName="MyDBModel", Name="Product")] 
    [Serializable()] 
    [DataContractAttribute(IsReference=true)] 
    public partial class Product : EntityObject 
    { 
     //.. 
    } 

它獲取客戶端項目也產生(在SilverlightProject.g.cs)

/// <summary> 
    /// The 'Product' entity class. 
    /// </summary> 
    [DataContract(Namespace="http://schemas.datacontract.org/2004/07/SilverlightProject")] 
    public sealed partial class Product : Entity 
    { 
     //.. 
    } 
+0

您是否在Silverlight客戶端中引用了一個程序集,其中定義了Product類型? –

+0

請參閱編輯問題 – Nemo

回答

1

您可以定義使用IncludeAssociation屬性CompositeDataProduct之間的關係。

[System.ServiceModel.DomainServices.Server.Include] 
[System.ComponentModel.DataAnnotations.Association("AssociationName", "MainKey", "AssociatedObjectKey")] 
public Product CurrentProduct { get; set; } 
0

(對不起我的英文不好)

您需要公開您的Product實體中的DomainService類也可能夠在Silverlight端看到它:

public IEnumerable<Product> GetProduct() 
{ 
    //... 
    return listProduct; 
} 
+0

我該如何暴露?已經可以在域服務類中訪問。 – Nemo

+0

您只需要在那裏返回'Product'類型或'IQueryable '或'IEnumerable '(就像您對CompositeData類所做的那樣) - 如果沒有這個,您遇到的問題就是發生了什麼...但如果它已經存在,我無法想象會發生什麼情況:( – Leo

0

下面是我做的快速將表添加到我的RIA Silverlight項目。 這個假設我已經有一個現有的ADO.NET實體數據模型,DomainService.cs和DomainService.metadata.cs

  1. 更新我的數據模型
  2. 建設項目
  3. 添加一個全新的域名服務班級和名字與你所擁有的不同。
  4. 請求時,只將新表添加到新的域服務。這個 應該爲你的新表的信息生成一個新的domainservice.cs和一個 domainservice.metadata.cs。
  5. 從新域服務中複製自動生成的代碼,並將其放入您現有的域服務的 中,並刪除剛創建的域服務。
  6. 對元數據做同樣的事情。
  7. 建立該項目,然後你完成。
0

它是可以通過定義ExternalReferenceAttribute和AssociationAttribute屬性 在你CurrentProduct財產。

[System.ServiceModel.DomainServices.ExternalReference] 
[System.ComponentModel.DataAnnotations.Association("AssociationName", "MainKey", "AssociatedObjectKey")] 
public Product CurrentProduct { get; set; } 

只需更換包括與ExternalReference屬性屬性。

相關問題