1

ASP.NET MVC4WebAPIを使用して製品のリストを返すRESTfulWebサービスを作成しようとしています。これが私のコントローラークラスです

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

サービスを実行し、ブラウザーから次のURLを呼び出すと:/ api / Product、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; }
}

ProductクラスからProductCategoryへの参照を削除すると、すべてが正常に機能します。しかし、それを含めると、次の例外が発生します。

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.

私が欠けているものについて何か考えはありますか?

よろしく

4

2 に答える 2

1

として宣言されているナビゲーション プロパティの遅延読み込みをサポートするためにvirtual、EF は、この種の例外につながるナビゲーション プロパティを持つすべてのモデルのプロキシを生成します。

非常に単純なアプリケーションの場合、EF のモデルを DTO として使用できますが (ナビゲーション プロパティがない場合)、複雑なアプリケーションの場合は、DTO とドメイン モデルを分離して区別する必要があります。DTO とドメイン モデル間を 1:1 でマッピングすることはできません。

したがって、あなたの場合、Web API レイヤーの DTO モデルをさらに作成しても問題ありません。

于 2013-03-14T08:14:36.267 に答える
1

Entity Framework は、遅延読み込みを実行できるように、POCO を EF Proxy POCO でラップしました。これは、Virtual属性を使用して、'lazy-loadable' ナビゲーション プロパティを作成します。それがシリアライゼーションエラーの原因だと思います。

新しいクラスを作成し、それに POCO をマップしてから、コントローラーから DTO スタイル クラスを渡すことができます。私は API から直接 EF オブジェクトを返したことがないので (私は常に別のものにマップします)、別のオプションを知りません。

http://valueinjecter.codeplex.com/またはhttp://automapper.org/のようなツールを使用する場合、EF POCO から DTO (データ転送オブジェクト) への変換は比較的簡単です。

于 2013-03-14T08:10:23.680 に答える