2012-01-22 17 views
6

Il modello My Entity Framework viene generato dal database di SQL Server. Poiché ho bisogno di accedere al database da Silverlight, ho generato un DomainService per RIAServices rispetto al modello EF. Product è uno degli autogenerati EntityObject corrispondente alla tabella Product. Sto tentando di passare la classe personalizzata CompositeData al client Silverlight come mostrato. Il problema è che il campo CurrentProduct non è accessibile nel client ma gli altri campi stringa/int sono accessibili. Come può rendere accessibile il CurrentProduct dal client?Impossibile accedere al tipo EntityObject tramite i servizi RIA

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

seguito è il metodo di servizio Domain:

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

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

EDIT: Product classe è generato automaticamente in Model1.Designer.cs

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

Esso viene generato nel progetto del client anche (in 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

Il client Silverlight fa riferimento a un assieme, in cui è definito il tipo Prodotto? –

+0

Vedere la domanda modificata – Nemo

risposta

1

È possibile definire una relazione tra CompositeData e Product utilizzando Include e Association attributi.

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

(dispiace per il mio cattivo inglese)

È necessario esporre il soggetto Product nella classe DomainService troppo per essere in grado di vederlo sul lato silverlight:

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

Come posso esporre? È già accessibile nella classe del servizio di dominio. – Nemo

+0

Hai solo bisogno di mettere un metodo lì restituendo il tipo 'Product' o un' IQueryable 'o' IEnumerable '(proprio come hai fatto con la classe' CompositeData') - Senza questo, il problema che hai è esattamente quello che succede ... ma se è già lì, non riesco a immaginare cosa potrebbe accadere :( – Leo

0

Ecco cosa faccio per aggiungere rapidamente tabelle al mio progetto RIA Silverlight. questo presuppone Ho già un ADO.NET Entity Modello dati esistenti, DomainService.cs, e DomainService.metadata.cs

  1. aggiorno il mio modello di dati
  2. progetto di costruzione
  3. aggiungere un nuovo dominio del servizio classe e nome sono qualcosa di diverso da quello che hai.
  4. aggiungere solo la nuova tabella al nuovo servizio di dominio quando viene richiesto. questo dovrebbe generare sia un nuovo domainservice.cs sia un dominio domainservice.metadata.cs con le informazioni per la nuova tabella.
  5. copia il codice generato automaticamente dal nuovo servizio di dominio e inseriscilo nel servizio di dominio esistente ed elimina quello appena creato.
  6. fare la stessa cosa per i metadati.
  7. costruire il progetto e poi il tuo fatto.
0

E 'possibile attraverso la definizione di ExternalReferenceAttribute e AssociationAttribute attribuiscono sopra la vostra proprietà CurrentProduct.

Basta sostituire l'attributo Include con l'attributo ExternalReference.