2011-07-21 11 views
2

Silverlight4、Ria ServicesおよびEntity Frameworkを使用している問題が発生しました。Riaサービスとナビゲーションプロパティの問題

私は、このメソッドが呼び出される私のDomainServiceクラスで、RIAサービスを通じていくつかのデータを取得しようと私のSLクライアントから

:私は、リストの内容を確認するとき

public IQueryable<LastMinuteWachtLijstPromotie> GetLastMinuteWachtLijstPromoties(){ 
    IQueryable<LastMinuteWachtLijstPromotie> list = (IQueryable<LastMinuteWachtLijstPromotie>)this.ObjectContext.LastMinuteWachtLijstPromoties.Include("Promotie"); 

    return (from LastMinuteWachtLijstPromotie lwmp in list where lwmp.Actief select lwmp); 
} 

、デバッグモードでは、それはでいっぱいですタイプLastMinuteWachtLijstPromotieのオブジェクト。 これらのオブジェクトには、Promotieというオブジェクトのナビゲーションプロパティがあります。 そして私はこれらのPromotieオブジェクトのプロパティにアクセスできます。読み込みが完了したときしかしメソッドが呼び出されますsilverightクライアントで

:予想通り、私はすべての要求LastMinuteWachtLijstPromotieオブジェクトを取得し、この方法では

public void OnLoadEntitiesCompleted(ServiceLoadResult<T> result) { 

} 

は、プロパティ Promotieしかしnullです。

私は

これらの同じ方法

は私のドメインモデルと異なるオブジェクトに使用されている(「Promotie」)Promotieが自動でメタデータクラス 生成されたプロパティの[含める]のタグを設定して、私は.INCLUDEを使用していますこれは完全に機能します。 また、.edmxファイルにデータベースのマッピングとナビゲーションのプロパティとの相違点があります。

誰もが同じ問題を抱えているか、解決策を知っていますか?

メタデータクラス:

[MetadataTypeAttribute(typeof(LastMinuteWachtLijstPromotie.LastMinuteWachtLijstPromotieMetadata))] 
     public partial class LastMinuteWachtLijstPromotie 
     { 

      // This class allows you to attach custom attributes to properties 
      // of the LastMinuteWachtLijstPromotie 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 LastMinuteWachtLijstPromotieMetadata 
      { 

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

       public int AlertId { get; set; } 

       public string ArtikelNummer { get; set; } 

       public Nullable<int> ArtikelVariant { get; set; } 

       public int LastMinuteWachtLijstPromotieId { get; set; } 

       [Include] 
       public Promotie Promotie { get; set; } 

       public int PromotieArtikelId { get; set; } 

       public int PromotieId { get; set; } 

       public bool Actief { get; set; } 

       public DateTime Aanmaakdatum { get; set; } 
      } 
     } 


     [MetadataTypeAttribute(typeof(Promotie.PromotieMetadata))] 
    public partial class Promotie 
    { 

     // This class allows you to attach custom attributes to properties 
     // of the Promotie 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 PromotieMetadata 
     { 

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

      public string ActieType { get; set; } 

      public string AssortimentsManagerNaam { get; set; } 

      public string AssortimentsManagerTeamIds { get; set; } 

      [Display(Name = "Commerciele tekst")] 
      [Required(ErrorMessageResourceName = "Required", ErrorMessageResourceType = typeof(Nokavision.ReclameFolder.UI.Web.Resources.ValidationResources))]    
      public string CommercieleTekst { get; set; } 

      [Display(Name = " ")] 
      public string CommercieleTekstDetails { get; set; } 

      [Include] 
      public Frame Frame { get; set; } 

      public Nullable<int> FrameId { get; set; } 

      public Nullable<DateTime> LastMinuteWijzigingsDatum { get; set; } 

      public string Opmerkingen { get; set; } 

      [Display(Name = "Op wachtlijst")] 
      public Nullable<bool> OpWachtLijst { get; set; } 

      //public Nullable<int> PromotieCopyId { get; set; } 

      public int PromotieId { get; set; } 

      [Include] 
      public EntityCollection<PromotieLeverancier> PromotieLeveranciers { get; set; } 

      [Include] 
      public EntityCollection<PromotieMutatie> PromotieMutaties{ get; set; } 

      //public Nullable<int> PromotieOrigineleId { get; set; } 

      [Include] 
      public EntityCollection<PromotieSymbool> PromotieSymbolen { get; set; } 

      public string Status { get; set; } 

      [Display(Name = "Promotie inhoud")] 
      public string PromotieInhoud { get; set; } 

      [Display(Name = "Promotie eenheid")] 
      public string PromotieEenheid { get; set; } 

      [Display(Name = "Promotie prijs")] 
      public decimal PromotiePrijs { get; set; } 
     } 
    } 
+0

あなたが特にLastMinuteWachtLijstPromotieとPromotieのために、メタデータクラスを追加することができますか? – Jehof

+0

元の投稿に追加、tnx – Thomas

+0

外部キーを追加せずにNavigationPropertyを定義しましたか? – Jehof

答えて

1

はLastMinuteWachtLijstPromotieMetadataクラスのプロパティPromotieプロパティにComposition属性を追加します。そうすればうまくいくはずです。

public partial class LastMinuteWachtLijstPromotie { 
    internal sealed class LastMinuteWachtLijstPromotieMetadata{ 
    [Include] 
    [Composition] 
    public Promotie Promotie { get; set; } 
    } 
} 
+0

ええと、これを追加して再構築してからテストしたところ、違いがないようです – Thomas

1

私は、これは古いスレッドであり、それは十分に他の場所で回答されているかもしれないが、私はちょうどそれにつまずいたと誰もがリンクまたはより良い答えを提供していないので、知っています。

私は現在、Silverlight 5を使用しています。これは私にとってはうまくいきました(SL4 IIRCではプロセスが同じと思います)。

クライアントにナビゲーションプロパティを宣言するときは、[Key]属性と[Association]属性を使用してRIAサービスにリレーションシップがあることを伝える必要があります。適切なオブジェクト。

まずメタデータクラス:

[MetadataTypeAttribute(typeof(Category.CategoryMetadata))] 
public partial class Category 
{ 
    internal sealed class CategoryMetadata 
    { 
     private CategoryMetadata() { 
     } 

     [Key] 
     public int Id { get; set; } 

     public string NAME { get; set; } 

     [Association("CategoryToProducts", "Id", "CAT")] 
     [Include] 
     public EntityCollection<Product> Products { get; set; } 
    } 
} 

[MetadataTypeAttribute(typeof(Order.OrderMetadata))] 
public partial class Order 
{ 

    internal sealed class OrderMetadata 
    { 

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

     [Key] 
     public int Id { get; set; } 

     public int PRODID { get; set; } 

     public DateTime DATE { get; set; } 

     public bool DONE { get; set; } 

     public int QTY { get; set; } 

     [Association("OrderToProduct", "PRODID", "Id", IsForeignKey = true)] 
     [Include] 
     public Product Product { get; set; } 
    } 
} 

[MetadataTypeAttribute(typeof(Product.ProductMetadata))] 
public partial class Product 
{ 
    internal sealed class ProductMetadata 
    { 
     private ProductMetadata() { 
     } 

     [Key] 
     public int Id { get; set; } 

     public int CAT { get; set; } 

     public string NAME { get; set; } 

     public string DESC { get; set; } 

     public decimal PRICE { get; set; } 

     public int QTY { get; set; } 

     public long UPC { get; set; } 

     [Association("ProdToCat", "CAT", "Id", IsForeignKey = true)] 
     [Include] 
     public Category Category { get; set; } 

     [Association("ProductToOrders", "Id", "PRODID")] 
     [Include] 
     public EntityCollection<Order> Orders { get; set; } 
    } 
} 

今、我々はそれが関連をロードするRIAサービスを指示する必要があります: (注意:インテリセンスはそれはドットが含まれるプロパティ名のリストを区切りだと言い、しかし私は、 .Include( "Category.SubCategory")のようなものを試しましたが、これは例外で失敗しました...しかし.Include( "Category")。インクルード( "SubCategory")は魅力的でした!)

public IQueryable<Product> GetProducts() { 
    return this.ObjectContext.Products.Include("Category"); 
} 

私は今のSilverlightクライアントからの私の「カテゴリー」プロパティにアクセスすることができ、それがNULLではありません:)

SilverXと同じ
+0

[Association]を追加しても何も変更されませんでした(SL5)。 – Timores

+0

同様に、私は最初にコードを使用しています – TChadwick

+0

私は、.edmxクラスとPOCOクラスを混在させてインベントリマップを作成していたと思います。 IIRCの経験は同じでした。私は似たようなプロジェクトに取り組んでからもうアクセスできないので、長いこと謝っています。 "Key"と "Association"の両方の属性を "Association"だけでなく一緒に使用することを覚えておいてください。キーはしばしばインデックス可能(数値)です。アソシエーションは、「IsForeignKey」が出現する他のクラスのキーに基づいていることがあります。 – SilverX

1

:ただ、問題があった、それを解決し、それが役に立つことができると思っていました誰か。

私はあまりにも正しく構成されていましたが(RIA Sでは[Include]、EFではInclude())、ナビゲーションプロパティはSilverlight側ではまだnullでした。

ドメインサービスメソッドが[Invoke]属性を使用していたことがわかりました(そしてIEnumerable<T>を返しました)。この属性を削除すると問題が解決しました。

(メソッドがList<Entity>パラメータを持っていたので、ちょうどレコードに対して、[起動]を使用していた)