2013-04-24 45 views
0

我有一個使用Entity Framework 5.0和POCO實體的WCF服務器應用程序。服務器通過WCF將POCO直接序列化到客戶端應用程序(我通過遵循以下博客文章中的說明設法執行此操作:http://www.sanderstechnology.com/?p=10142)。直到我今天遇到新的問題,這一直工作得很好。WCF,POCO和繼承:數據合同問題

我有一個簡單的情況,如下圖所示我的數據模型: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(); 
    } 
} 

在我的數據庫我有類型的項目A和項目B的情況下(T帽子從項目繼承)。所以上面的LINQ查詢實際上包含了我的響應中的ProjectA和ProjectB的類型。這些類型被序列化並被髮送到客戶端。發生這種情況時,客戶端發生以下錯誤(服務器應用程序中沒有錯誤):

服務器沒有提供有意義的回覆;這可能是由於合同不匹配,會話過早關閉或內部服務器錯誤造成的。

問題似乎是在我的數據合同類型塊鏈接到類型項目。但是,我的響應返回包含鏈接到塊的ProjectA和ProjectB類型的數據。

我不知道如何解決這個問題。我認爲它可以通過實現一個自定義的DataContractResolver來解決,但是我還沒有找到任何可行的例子。

任何想法?

回答

1

如果您的對象包含其他類型而不是明顯的(例如接口實現或派生類),則您將需要KnownType屬性。

檢查MSDN中的示例,它很不錯。

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

這是行不通的。 KnownType屬性不能添加到方法中,而只能添加到類和結構聲明中。在我的情況下,我不想明確定義數據約定 - 我想直接序列化數據庫POCO對象。由於POCO是自動生成的,因此我無法將KnownType屬性添加到它們中。 – user2315475 2013-04-24 18:09:54

+1

您說得對,對不起,您需要將屬性添加到您的服務中,而不是您的方法。 – nvoigt 2013-04-24 19:34:13