无法通过RIA服务访问EntityObject类型

本文关键字:访问 EntityObject 类型 服务 RIA | 更新日期: 2023-09-27 18:21:15

My Entity Framework模型是从SQL Server数据库生成的。由于我需要从Silverlight访问数据库,所以我针对EF模型为RIAServices生成了一个DomainService。CCD_ 1是与表CCD_ 3相对应的自动生成的CCD_。我正试图将自定义类CompositeData传递到Silverlight客户端,如图所示。问题是CurrentProduct字段在客户端中不可访问,但其他string/int字段是可访问的。如何从客户端访问CurrentProduct

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

以下是域服务方法:

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

从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!
        }                     
    }

编辑:Product类在Model1.Designer.cs 中自动生成

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

它也在客户端项目中生成(在SilverlightProject.g.cs中)

    /// <summary>
    /// The 'Product' entity class.
    /// </summary>
    [DataContract(Namespace="http://schemas.datacontract.org/2004/07/SilverlightProject")]
    public sealed partial class Product : Entity
    {
       //..
    }

无法通过RIA服务访问EntityObject类型

您可以使用Product0和Association属性定义CompositeDataProduct之间的关系。

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

(抱歉我英语不好)

您还需要在DomainService类中公开Product实体,以便能够在silverlight侧看到它:

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

以下是我为RIA Silverlight项目快速添加表所做的操作。这假设我已经有一个现有的ADO.NET实体数据模型、DomainService.cs和DomainService.metadata.cs

  1. 我更新我的数据模型
  2. 生成项目
  3. 添加一个全新的域服务类和名称与您现有的不同
  4. 当您的新域服务提出要求时,只将新表添加到该服务中。这应该同时生成一个新的domainservice.cs和domainservice.metadata.cs,其中包含新表的信息
  5. 从新的域服务中复制出自动生成的代码,并将其放入您现有的域服务,并删除您刚刚创建的域服务
  6. 对元数据执行同样的操作
  7. 构建项目,然后完成

可以通过定义ExternalReferenceAttribute和AssociationAttribute属性您的CurrentProduct属性。

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

只需将Include属性替换为ExternalReference属性。