與WCF

2012-01-17 63 views
5

系列化POCO代理當我跑我的服務我得到異常:與WCF

服務器遇到錯誤處理請求。異常消息是'Can not serialize parameter of parameter type of System.Data.Entity.DynamicProxies.Cosik_14C2 ...'(對於操作'GetCosik',契約'ICosikService'),因爲它不是確切類型'Project.Domain.Entities.Cosik '在方法簽名中,不在已知類型集合中。爲了序列化參數,請將類型添加到使用ServiceKnownTypeAttribute的操作的已知類型集合中。'。查看服務器日誌獲取更多詳細信

我是新來的WCF服務和實體框架,我會很感激任何幫助/建議。

我正在使用實體框架4.1。使用代碼首先,我創建的數據庫有兩個表:

[DataContract(IsReference=true)] 
public class Cosik 
{ 
    [DataMember] 
    public int cosikID { get; set; } 

    [DataMember] 
    public string title { get; set; } 

    [DataMember] 
    public int DifficultyID { get; set; } 
    [DataMember] 
    public virtual Difficulty Difficulty { get; set; } 
} 

[DataContract(IsReference=true)] 
public class Difficulty 
{ 
    [DataMember] 
    public int DifficultyID { get; set; } 

    [DataMember] 
    [Required] 
    public string NameToDisplay { get; set; } 
} 

接下來,我創建的WCF服務應用程序,並使其RESTful的。下面是用於接口代碼:

[ServiceContract] 
public interface ICosikService 
{ 
    [OperationContract] 
    [ApplyDataContractResolver] 
    [WebGet(UriTemplate = "/cosik")] 
    Cosik GetCosik(); 
} 

和執行合同的是

public class RecipeService : IRecipeService 
{ 
//repository of Cosik entities - stores collection of all 
//Cosik entities that can be queried from DB 
private ICosikRepository cosikRepo; 
... 

public Cosik GetCosik() 
    { 
     Cosik c = cosikRepo.GetById(1); 
     return c; 
    } 

的我實現ApplyDataContractResolverAttribute類上給出:http://msdn.microsoft.com/en-us/library/ee705457.aspx並加入[ApplyDataContractResolver]註釋GetCosik方法。但是,它沒有幫助。

任何建議我錯過了什麼?

+0

它看起來像* Cosik *在你的服務操作GetCosik()和已標記因爲數據合同與您實體模型中定義的* Cosik *不同,並且您的服務因某種原因試圖返回。 – 2012-01-17 20:53:32

+0

如果使用'context禁用[ObjectContext](http://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext.aspx)中的延遲加載,是否還會出現相同的錯誤。 ContextOptions.LazyLoadingEnabled = false'? – 2012-01-18 09:32:04

+0

您可以在RecipeService類上面添加[KnownType(Cosik)]嗎? – Rajesh 2012-01-18 10:24:24

回答

4

而不是開發自定義解析器關閉代理創建。代理服務器就不會像WCF情景,因爲懶加載無論如何必須序列化和動態變化的跟蹤過程中關閉從未使用過:

context.Configuration.ProxyCreationEnabled = false; 
+0

通過關閉代理創建,我所有的虛擬對象(字段)都會變爲空,並且我失去了EF提供的功能。我想知道是否真的是這樣的情況,我必須查詢數據庫以使用適當的數據自行設置虛擬域。 我經歷了很多頁面,解釋瞭如何使用wcf和簡單數據的簡單示例,但簡單的數據在現實世界中相當粗糙。任何人都可以指點我一些資源/教程,解釋如何使用EF來處理更復雜的數據? 現在我使用wcf(沒有休息),它的工作原理,但我想學習如何使用它在休息方式 – anetafr 2012-01-18 14:41:14

+0

你的虛擬領域爲空,因爲你沒有使用急切的加載。在知道您需要該數據的情況下使用延遲加載是不正確的,因爲EF必須爲「每個屬性」創建單獨的數據庫往返。 – 2012-01-18 17:49:43

+0

@anetafr爲了獲得更好的REST支持,請查看項目項類型'WCF數據服務',它可以與代碼優先使用,雖然它確實有它自己的障礙(http://blogs.msdn.com/b/writingdata_services /archive/2011/06/15/entity-framework-4-1-code-first-and-wcf-data-services.aspx)。就我個人而言,我會選擇在我的服務層中轉換實體和DTO之間的更清晰的選項。無論如何,還有其他一些選項可供您思考.. – kallotec 2012-08-16 03:40:19