2012-01-22 11 views
6

My Entity FrameworkモデルがSQL Serverデータベースから生成されます。 Silverlightからデータベースにアクセスする必要があるため、EFモデルに対してRIAServices用のDomainServiceを生成しました。 Productは、テーブルProductに対応する自動生成されたEntityObjectの1つです。私は、カスタムクラス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(); 
    } 
} 

ドメインサービス方法であって、Silverlightのクライアントから

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

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! 
     }      
    } 

EDIT: ProductクラスはModel1.Designer.cs

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

それはあなたがあるには余りにものDomainServiceクラスであなたのProduct実体を公開する必要が

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

Silverlightクライアントは、製品タイプが定義されているアセンブリを参照していますか? –

+0

編集した質問 – Nemo

答えて

1

あなたはIncludeAssociation属性を使用してCompositeDataProductとの間の関係を定義することができます。

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

(私の悪い英語のため申し訳ありません)

(SilverlightProject.g.cs中)も、クライアントプロジェクトで生成されます

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

を参照してください。どのように公開できますか? Isは既にドメインサービスクラスでアクセス可能です。 – Nemo

+0

'Product'型や' I2eryable 'や' IEnumerable 'を返すメソッドを置くだけでいいです(これは' CompositeData'クラスと同じように) - これがなければ正確に何が起こるのですか...それが既にある場合、私は何が起こっている可能性が想像することはできません:( – Leo

0

ここで私のRIA Silverlightプロジェクトにすばやくテーブルを追加する方法を説明します。 これは私が既存のADO.NETエンティティデータモデル、DomainService.cs、およびDomainService.metadata.cs

  1. 私は私のデータモデルを更新があることを想定してい
  2. は、ブランドの新しいドメインサービスを追加し、ビルドプロジェクトクラスと名前はあなたが持っているものとは違うものです。
  3. 尋ねられたときに新しいドメインサービスに新しいテーブルのみを追加します。この は、新しいdomainservice.csと domainservice.metadata.csの両方を新しいテーブルの情報とともに生成する必要があります。
  4. 新しいドメインサービスから自動生成されたコードをコピーし、既存のドメインサービス に置き、今作成したドメインサービスを削除します。
  5. メタデータについても同じことを行います。
  6. プロジェクトをビルドしてから完了します。
0

それはあなたのCurrentProductプロパティよりExternalReferenceAttributeとAssociationAttribute属性 を定義することも可能です。

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

Include属性をExternalReference属性に置き換えてください。

関連する問題