2012-01-22 17 views
6

Varlık Framework modelim SQL Server veritabanından oluşturulur. Silverlight'tan veritabanına erişmem gerektiğinden, EF modeline karşı RIAServices için bir DomainService oluşturdum. Product, Product tablosuna karşılık gelenotomasyonundan biridir. Özel sınıf CompositeData'u gösterildiği gibi Silverlight istemcisine iletmeye çalışıyorum. Sorun, istemcide CurrentProduct alanın erişilebilir olmamasıdır, ancak diğer dize/int alanlarına erişilebilir. CurrentProduct müşteriden nasıl erişilebilir? TakipEntityObject türüne RIA hizmetleri aracılığıyla erişilemiyor

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(); 
    } 
} 

Alan Hizmeti yöntemidir: Silverlight istemciden

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

DÜZENLEME: Product sınıf Model1.Designer.cs

içinde otomatik olarak oluşturulan bir
[EdmEntityTypeAttribute(NamespaceName="MyDBModel", Name="Product")] 
    [Serializable()] 
    [DataContractAttribute(IsReference=true)] 
    public partial class Product : EntityObject 
    { 
     //.. 
    } 

O

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

Silverlight istemcisi, Ürün türünün tanımlandığı bir derleme başvuruyor mu? –

+0

Lütfen düzenlenmiş soruya bakın – Nemo

cevap

1

Sen Include ve Association özelliklerini kullanarak CompositeData ve Product arasında bir ilişki tanımlayabilirsiniz. Bu ExternalReferenceAttribute ve AssociationAttribute tanımlayarak mümkündür

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

(benim kötü İngilizce için üzgünüm) (SilverlightProject.g.cs olarak) ayrıca istemci projesinde oluşturulan alır

Sen olamayacak kadar DomainService sınıfta Product varlık açığa çıkarmam gerek

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

Nasıl açığa çıkabilirim? Domain Service sınıfında zaten erişilebilir. – Nemo

+0

Sadece "Ürün" veya "IQueryable " veya "IEnumerable " (tıpkı CompositeData sınıfı ile yaptığınız gibi) döndüren bir yöntem eklemeniz gerekir - Bu olmadan, yaşadığınız sorun tam olarak ne olur? ... ama eğer zaten oradaysa, neler olabileceğini hayal edemiyorum :( – Leo

0

i hızla benim DEA Silverlight projeye tabloları eklemek için ne olduğunu: silverlight tarafta görmek mümkün. bu zaten varolan ADO.NET Entity Data Model, DomainService.cs ve DomainService.metadata.cs

  1. benim veri modelini güncellemek zorunda varsayar
  2. yepyeni Alan Adı Hizmetini eklemek inşa projesi sınıf ve isim sahip olduğunuzdan farklı bir şeydir.
  3. Sadece yeni tabloyu, yeni Etki Alanı Hizmetinize sorduğunda ekleyin. Bu , yeni tablonuz için yeni bir domainservice.cs ve domainservice.metadata.cs üretmelidir.
  4. Otomatik oluşturulan kodu yeni etki alanı hizmetinden kopyalayın ve mevcut etki alanı hizmetinize yerleştirin ve yeni oluşturduğunuz olanı silin. Meta veriler için
  5. aynı şeyi yapın.
  6. projeyi oluşturun ve ardından işiniz bitti.
0

sizin CurrentProduct mülkiyet üzerinde bağlıyor.

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

Yalnızca Include niteliğini ExternalReference özniteliğiyle değiştirin.