我有一個使用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來解決,但是我還沒有找到任何可行的例子。
任何想法?
這是行不通的。 KnownType屬性不能添加到方法中,而只能添加到類和結構聲明中。在我的情況下,我不想明確定義數據約定 - 我想直接序列化數據庫POCO對象。由於POCO是自動生成的,因此我無法將KnownType屬性添加到它們中。 – user2315475 2013-04-24 18:09:54
您說得對,對不起,您需要將屬性添加到您的服務中,而不是您的方法。 – nvoigt 2013-04-24 19:34:13