SAK
SAK

Reputation: 25428

Cannot access EntityObject type via RIA services

My Entity Framework model is generated from SQL Server database. Since I need to access database from Silverlight, I generated a DomainService for RIAServices against the EF model. Product is one of the autogenerated EntityObject corresponding to the table Product. I am attempting to pass the custom class CompositeData across to the Silverlight client as shown. The problem is that CurrentProduct field is not accessible in the client but the other string/int fields are accessible. How can make CurrentProduct accessible from client?

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

Following is the Domain Service method:

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

From the Silverlight client,

    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 class is autogenerated in Model1.Designer.cs

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

It gets generated in the client project also (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
    {
       //..
    }

Upvotes: 6

Views: 709

Answers (4)

Divyesh Sharma
Divyesh Sharma

Reputation: 195

It is possible by defining ExternalReferenceAttribute and AssociationAttribute attribute over your CurrentProduct property.

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

Just replace Include attribute with ExternalReference attribute.

Upvotes: 0

Zabavsky
Zabavsky

Reputation: 13640

You can define a relation between CompositeData and Product using Include and Association attributes.

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

Upvotes: 1

FlyTigert
FlyTigert

Reputation: 51

Here is what i do to quickly add tables to my RIA Silverlight project. this assumes i already have an existing ADO.NET Entity Data Model, DomainService.cs, and DomainService.metadata.cs

  1. i update my data model
  2. build project
  3. add a brand new Domain Service class and name is something different than the one you have.
  4. add only the new table to your new Domain Service when it asks. this should generate both a new domainservice.cs and a domainservice.metadata.cs with the info for your new table.
  5. copy out the auto generated code from the new domain service and place it in your existing domain service and delete the one you just created.
  6. do the same thing for the metadata.
  7. build the project and then your done.

Upvotes: 0

Leo
Leo

Reputation: 7449

(sorry for my bad english)

You need to expose your Product entity in the DomainService class too to be able to see it on the silverlight side:

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

Upvotes: 0

Related Questions