Cannot access EntityObject type via RIA services

余生颓废 提交于 2019-12-06 00:51:40

问题


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
    {
       //..
    }

回答1:


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



回答2:


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



回答3:


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.



回答4:


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.



来源:https://stackoverflow.com/questions/8960944/cannot-access-entityobject-type-via-ria-services

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!