我可以添加序列化属性到我的实体与RIA服务



我可以使用RIA服务向实体或复杂类型添加可序列化属性吗?或者我可以使用RIA创建包含EntityObject的DTO吗?如果这是不可能的,变通的办法是什么?

我已经看到我如何扩展一个实体时使用RIA服务与Silverlight?它处理向实体添加属性,但它是一个无数据属性,只是包装现有属性。换句话说,它没有保存任何新数据。很抱歉这个问题太长了。

我有两个结果(一个EntityObject从表查询,一个ComplexObject从存储过程)在我的数据层,我想一起返回&在单个服务调用中。从演示的角度来看,它们是不可分割地联系在一起的(一个没有另一个是没有意义的),而且做两个调用然后在客户端将它们连接起来是不合适的。但是我在一个结果中得到两个对象时遇到了问题。


首先,我尝试通过为Entity添加属性来扩展ComplexObject

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中时,这些实体有什么特殊之处可以阻止它们序列化?

对于复杂的实体,您必须为它们提供关系(例如外键),否则无法向客户端公开复合实体。例如:

此示例将类别实体集合封装在前面的产品实体中:

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

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

最新更新