2011-11-09 45 views
1

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

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

我有两个结果(一个EntityObject从表中查询,一个ComplexObject从一个存储过程)在我的数据层,我想在一个单一的服务呼叫一起&返回。从陈述的观点来看,它们有着千丝万缕的联系(如果没有其他的话,它们就没有意义了),做两个电话然后加入客户端是不合时宜的。但是我在获得单个结果中的两个对象时遇到了问题。


首先我试图通过添加属性为Entity

public partial class MyProcResult 
{   
    [DataMember] 
    public MyEntity Foo { get; set; } 
} 

,并在域服务操作填充它到ComplexObject延伸。该属性在服务器端设置,但不会被序列化 - 事实上,客户端甚至不会看到该属性!

经过一番阅读,很明显我可以通过命名我的部分类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

只是一些随机的想法:是否myEntity所从实体继承? (我看到MyContainer没有)。更重要的是,MyProcResult是否继承自ComplexObject?您是否尝试过包含属性?从msn中说明:“复杂类型成员总是基于DataContract/DataMember注释深入地进行序列化。“ – Polity

+0

@Polity - 是的,MyEntity从”EntityObject“继承并出现在EDMX设计器上,而MyProcResult继承自”ComplexObject“,并且显示为复杂类型Model Browser窗格,你可以在我的第二个示例中看到,我只是将它们标记为DataMember,而不是复杂的类型或实体关联,我期望它们可以作为常规.NET对象序列化。 –

回答

2

对于复杂的天才,你必须给他们的关系(例如外键),否则不可能将复合能力暴露给客户端。例如:

这个样本包装类实体集合在以前的产品实体:

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

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

相关问题