我可以添加序列化属性到我的实体与RIA服务
本文关键字:实体 RIA 服务 我的 添加 序列化 属性 我可以 | 更新日期: 2023-09-27 18:14:06
我可以使用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类型时,只有当它共享关联并且它是一个导航属性时,它才会暴露给客户端。由于实体只能通过查询和更改跟踪来检索,因此必须正确工作,从实体对象派生的任何属性都必须共享关联。