我有一个使用 Entity Framework 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 的类型,以响应我的响应。这些类型被序列化并发送到客户端。发生这种情况时,我在客户端收到以下错误(服务器应用程序中没有错误):
服务器没有提供有意义的回复;这可能是由于合同不匹配、会话过早关闭或内部服务器错误造成的。
问题似乎是在我的数据合同类型 Block 链接到类型 Project。但是,我的响应返回的数据包含链接到 Blocks 的类型 ProjectA 和 ProjectB。
我不知道如何解决这个问题。我认为它可以通过实现自定义 DataContractResolver 来解决,但我还没有找到任何工作示例如何做到这一点。
有任何想法吗?