我可以使用RIA服务向我的实体添加可序列化属性吗?

时间:2011-11-09 00:57:46

标签: c# .net silverlight linq-to-entities wcf-ria-services

我可以使用RIA服务向Entity或ComplexType添加可序列化属性吗?或者我可以使用RIA创建包含EntityObject的DTO吗?如果不可能,那么解决方法是什么?

我见过How Can I Extend A Entity When Using RIA Services With Silverlight?处理向实体添加属性,但它是一个无数据属性,只包含现有属性。换句话说,它没有持有任何新数据。我为这个问题的长度道歉。

我有两个结果(一个EntityObject来自一个表格查询,一个ComplexObject来自我的数据层中的存储过程中我想要一起返回&在一个服务电话中。从呈现的角度来看,它们之间有着千丝万缕的联系(没有另一个就没有意义),做两个电话然后在客户端加入它们是不合时宜的。但是我在单个结果中获取两个对象时遇到问题。


首先,我尝试通过为ComplexObject

添加属性来扩展Entity
public partial class MyProcResult
{        
    [DataMember]
    public MyEntity Foo { get; set; }
}

并在域服务操作中填充它。该属性设置在服务器端,但它没有被序列化 - 实际上客户端甚至没有看到属性!

经过一些阅读后,很明显我可以通过命名我的部分类MyProcResult.shared.cs来让客户端知道属性 - 现在客户端知道该属性存在,但它仍然没有被序列化。

所以我假设RIA服务没有公开非常彻底的服务合同并尝试别的东西。我的下一个尝试是创建一个DTO,我将在其中包含我的两个对象 - 应该工作,对吗?

[DataContract]
public class MyContainer
{
    [DataMember]
    public MyProcResult Bar { get; set; }
    [DataMember]
    public MyEntity Foo { get; set; }
}

同样,它在序列化之前全部填充。这次客户端无法看到MyEntity属性。它认为MyContainer只有MyProcResult属性。客户端生成的代码不包含其他属性!

发生了什么事?这些实体在标记为[DataMember]时,或者当包含在DTO中时,会阻止它们被序列化,这有什么特别之处?

2 个答案:

答案 0 :(得分:2)

对于复杂的烯类,你必须为它们提供关系(例如外键),否则不可能将复合能量暴露给客户端。例如:

此示例在以前的Product实体中包装类别实体集合:

public partial class ProductWrapper 
{
     [Key]     
     public Guid Id { get; set; }     
     public string Name { get; set; }

     [Include]
     [Association("FK_ProductsWrapper", "Id", "CategoryId")]     
     public Category[] CategoryList { get; set; } 
}

答案 1 :(得分:1)

当属性类型为EntityObject时,只有当它共享一个关联并且它是一个导航属性时,它才会暴露给客户端。由于实体只能通过查询检索,并且更改跟踪必须正常工作,因此从实体对象派生的任何属性都必须共享关联。