1

我正在嘗試創建一個RESTful Web服務,該服務返回使用ASP.NET MVC4 Web API的產品列表。這裏是我的控制器類ASP.NET MVC4 Web API控制器序列化

public class ProductController : ApiController 
{ 
    public IEnumerable<Product> GetProducts() 
    { 
     WebCatalogContext dbcontext = DatabaseConfig.Instance.Context; 
     List<Product> plist = dbcontext.Products.ToList(); 
     return plist; 
    } 
} 

當我跑我的服務,並從我的瀏覽器中調用以下URL:/ API /產品,我得到System.Runtime.Serialization.SerializationException。我看着我的plist物體,它沒有問題。

這裏是我的數據模型:

[DataContract(Name = "p")] 
[Serializable]  
public class Product 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    [DataMember(Name = "id")] 
    public int Id { get; set; } 

    [Required, MaxLength(50)] 
    [DataMember(Name = "ti")] 
    public string Title { get; set; } 

    [Required] 
    [DataMember(Name = "de")] 
    public string Description { get; set; } 

    [Required] 
    [DataMember(Name = "ph")] 
    public string PhotoURL { get; set; } 

    [DataMember(Name = "ca")]   
    public virtual ProductCategory Category { get; set; } 
} 


[DataContract(Name="pc")] 
[Serializable] 
public class ProductCategory 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    [DataMember(Name="id")] 
    public int Id { get; set; } 

    [DataMember(Name="nm")] 
    public string Name { get; set; } 
} 

當我從我的產品類中刪除提及產品分類,所有工作的事情就好了。但是,當我包含它時,我得到以下異常。

Type 'System.Data.Entity.DynamicProxies.Product_664E9A0AA1F165A26C342B508BFFF1279FD3FE059285225BDA19F407A29A9CAD' with data contract name 'Product_664E9A0AA1F165A26C342B508BFFF1279FD3FE059285225BDA19F407A29A9CAD: http://schemas.datacontract.org/2004/07/System.Data.Entity.DynamicProxies ' is not expected. Consider using a DataContractResolver or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.

約我缺少的是什麼你知道嗎?

問候

回答

1

實體框架已經包裹你的POCO與EF代理POCO,因此它能執行延遲加載 - 這個使用Virtual屬性來創建一個「懶加載」導航屬性。我期望這是序列化錯誤的來源。

您可以創建一個新類並將POCO映射到該類 - 然後從控制器傳遞DTO樣式類。我從來沒有直接從API返回EF對象(我總是映射一些其他的東西),所以我不知道另一種選擇。

EF POCO到DTO(數據傳輸對象)相對無痛如果你使用像http://valueinjecter.codeplex.com/http://automapper.org/

+0

感謝您的回答,非常有幫助 – Furkan 2013-03-14 08:47:55

1

工具爲了支持遲緩裝載的用於其被聲明爲virtual導航屬性,EF將生成的任何模型的代理其導航屬性會導致這種異常。

對於非常簡單的應用程序,您可以使用EF中的模型作爲DTO(如果沒有導航屬性),但對於複雜的應用程序,您應該單獨區分DTO和域模型。它不應該在DTO和域模型之間映射1:1。

因此,在你的情況下,你爲Web API層創建更多的DTO模型,它會沒事的。