2012-01-22 8 views
6

Mój model Entity Framework jest generowany z bazy danych SQL Server. Ponieważ potrzebuję dostępu do bazy danych z Silverlight, wygenerowałem usługę DomainService dla RIAServices w stosunku do modelu EF. Product jest jednym z autogenerowanych EntityObject odpowiadającym tabeli Product. Próbuję przekazać niestandardową klasę CompositeData do klienta Silverlight, jak pokazano. Problem polega na tym, że pole CurrentProduct nie jest dostępne w kliencie, ale dostępne są inne pola string/int. W jaki sposób można uzyskać CurrentProduct od klienta?Nie można uzyskać dostępu do typu EntityObject za pośrednictwem usług 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(); 
    } 
} 

Po to metoda usługi domeny:

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

Z Silverlight klienta

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 klasa jest wygenerowany automatycznie w Model1.Designer.cs

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

Robi wygenerowane w projekcie klienta również (w 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

Czy klient Silverlight odwołuje się do zespołu, w którym zdefiniowano typ produktu? –

+0

Zobacz edytowane pytanie – Nemo

Odpowiedz

1

Można zdefiniować relację między CompositeData i Product korzystając Include i Association atrybuty.

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

(przepraszam za mój zły język angielski)

Trzeba wystawiać podmiot Product w klasie DomainService też być można go zobaczyć po stronie silverlight:

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

Jak mogę odsłonić? Jest już dostępny w klasie Domain Service. – Nemo

+0

Trzeba tylko umieścić metodę zwracającą typ "Product" lub "IQueryable " lub "IEnumerable " (tak jak w przypadku klasy "CompositeData") - Bez tego problem, który masz, jest dokładnie taki, jaki się dzieje ... ale jeśli już tam jest, nie wyobrażam sobie, co może się dziać :( – Leo

0

Oto, co robię, aby szybko dodać tabele do mojego projektu RIA Silverlight. zakłada to mam już istniejące ADO.NET Entity Data Model, DomainService.cs i DomainService.metadata.cs

  1. zaktualizować model danych
  2. budować projekt
  3. dodać nową usługę Domain klasa i imię to coś innego niż ten, który masz.
  4. dodać nową tabelę do nowej usługi domenowej, gdy zostanie wyświetlone pytanie. ten powinien wygenerować zarówno nowy plik domainservice.cs, jak i domainservice.metadata.cs z informacją o nowej tablicy.
  5. skopiuj wygenerowany automatycznie kod z nowej usługi domeny i umieść go w istniejącej usłudze domeny i usuń ten, który właśnie utworzyłeś.
  6. zrobić to samo dla metadanych.
  7. zbuduj projekt, a następnie gotowe.
0

Jest to możliwe poprzez zdefiniowanie ExternalReferenceAttribute i AssociationAttribute przypisują na nieruchomości CurrentProduct.

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

Wystarczy wymienić atrybut Include z atrybutem ExternalReference.

Powiązane problemy