WCF、POCO和继承:数据契约问题

本文关键字:数据 契约 问题 继承 POCO WCF | 更新日期: 2023-09-27 18:10:45

我有一个使用实体框架5.0和POCO实体的WCF服务器应用程序。服务器通过WCF将poco直接序列化到客户端应用程序(我通过以下博客文章中的说明做到了这一点:http://www.sanderstechnology.com/?p=10142)。在我今天遇到一个新问题之前,这一直工作得很好。

我的数据模型中有一个简单的情况,如下图所示:http://roponenp.kapsi.fi/images/datamodel.png

在我的服务器我有一个方法,可用于获取块:

[OperationContract]
[ApplyDataContractResolver]
[CyclicReferencesAware(true)]
List<Block> GetBlocks();

我需要将链接到块的项目包含到我的响应中,所以我做以下操作:

public List<Block> GetBlocks()
{
    using (ModelContainer db = new ModelContainer())
    {
        db.Configuration.ProxyCreationEnabled = false;
        db.Configuration.LazyLoadingEnabled = false;
        return db.Block.Include(it => it.Project).ToList();
    }
}

在我的数据库中,我有ProjectA和ProjectB类型的实例(从Project继承)。所以上面的LINQ查询实际上包含了ProjectA和ProjectB的类型。这些类型被序列化并发送给客户端。当发生这种情况时,我在客户端得到以下错误(服务器应用程序中没有错误):

服务器没有提供有意义的回复;这可能是由于合约不匹配、会话过早关闭或内部服务器错误造成的。

问题似乎是,在我的数据合同类型块链接到类型项目。但是,我的响应返回的数据类型包含链接到Blocks的ProjectA和ProjectB。

我不知道如何解决这个问题。我认为这可以通过实现自定义DataContractResolver来解决,但我还没有找到任何可行的例子。

任何想法?

WCF、POCO和继承:数据契约问题

如果你的对象包含其他明显的类型(例如接口实现或派生类),你将需要一个KnownType属性。

查看MSDN中的示例,它非常好。

[ServiceContract]
[KnownType(typeof(ProjectA))]
[KnownType(typeof(ProjectB))]
class SomeService
{
  [OperationContract]
  [ApplyDataContractResolver]
  [CyclicReferencesAware(true)]
  List<Block> GetBlocks();