2012-01-22 24 views
6

El modelo de My Entity Framework se genera a partir de la base de datos de SQL Server. Como necesito acceder a la base de datos de Silverlight, generé un DomainService para RIAServices en comparación con el modelo de EF. Product es uno de los EntityObject autogenerados correspondientes a la tabla Product. Estoy intentando pasar la clase personalizada CompositeData al cliente de Silverlight como se muestra. El problema es que el campo CurrentProduct no está accesible en el cliente, pero se puede acceder a los otros campos string/int. ¿Cómo puede hacer que CurrentProduct sea accesible desde el cliente?No se puede acceder al tipo de EntityObject a través de los servicios de 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(); 
    } 
} 

A continuación se presenta el método de Servicio de dominio:

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

Desde el cliente de 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 clase se genera automáticamente en Model1.Designer.cs

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

Se pone genera en el proyecto de cliente también (en 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

¿El cliente de Silverlight hace referencia a un ensamblaje, donde se especifica el tipo Producto? –

+0

Consulte la pregunta editada – Nemo

Respuesta

1

Se puede definir una relación entre CompositeData y Product usando Include y Association atributos.

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

(lo siento por mi mala Inglés)

Es necesario exponer a su entidad Product en la clase DomainService ser demasiado capaz de verlo en el lado silverlight:

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

¿Cómo puedo exponer? Ya es accesible en la clase de servicio de dominio. – Nemo

+0

Solo necesitas poner un método devolviendo el tipo 'Product' o' IQueryable 'o' IEnumerable '(como hiciste con la clase' CompositeData') - Sin esto, el problema que tienes es exactamente lo que sucede ... pero si ya está allí, no puedo imaginar lo que podría estar pasando :( – Leo

0

Esto es lo que hago para agregar tablas rápidamente a mi proyecto de RIA Silverlight. esto supone ya tengo un modelo existente de datos ADO.NET Entity, DomainService.cs y DomainService.metadata.cs

  1. puedo actualizar mi modelo de datos
  2. proyecto de construcción
  3. agregar un nuevo servicio de dominio de marca clase y nombre es algo diferente al que tienes.
  4. agregue solo la nueva tabla a su nuevo servicio de dominio cuando lo solicite. este debe generar un nuevo domainservice.cs y un domainservice.metadata.cs con la información para su nueva tabla.
  5. copie el código generado automáticamente del nuevo servicio de dominio y colóquelo en su servicio de dominio existente y elimine el que acaba de crear.
  6. haga lo mismo para los metadatos.
  7. construye el proyecto y luego listo.
0

Es posible mediante la definición de ExternalReferenceAttribute y AssociationAttribute atribuyen sobre su propiedad CurrentProduct.

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

Simplemente reemplace el atributo Incluir con atributo ExternalReference.

Cuestiones relacionadas