我可以使用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中时,会阻止它们被序列化,这有什么特别之处?
答案 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时,只有当它共享一个关联并且它是一个导航属性时,它才会暴露给客户端。由于实体只能通过查询检索,并且更改跟踪必须正常工作,因此从实体对象派生的任何属性都必须共享关联。