0

.Net Mvc 4アプリケーションをビルドしましたが、RESTで拡張したいと思います。

Entity Frameworkを使用していますが、次の問題があります。

私の目標は、カテゴリーに複数の商品があり、商品が複数のカテゴリーに属することができるシステムを作ることです。

次のように:

public class Categorie
{
    [Key]
    public int Id { get; set; }
    [Required]
    public string Naam { get; set; }
    [Required]
    public string Omschrijving { get; set; }
    public byte[] Plaatje { get; set; }
    private List<Product> producten;
    public virtual List<Product> Producten
    {
        get { return producten; }   
        set { producten = value; }
    }
}

public class Product
    {
        [Key]
        public int Id { get; set; }
        [Required]
        public string Naam { get; set; }
        [Required]
        public string Omschrijving { get; set; }
        [Required]
        public double Prijs { get; set; }
        private List<Categorie> categorien = new List<Categorie>();

        public virtual List<Categorie> Categorien
        {
            get { return categorien; }
            set { categorien = value; }
        }
        [Required]
        public byte[] Plaatje { get; set; }
    }

注:エンティティフレームワークがマージテーブルを作成するように、そこには仮想プロパティがあります。通常、すべてのカテゴリを製品にリンクし、その逆も同様です。

そして私の残りは次のようになります:

// GET api/Rest/5
    public Product GetProduct(int id)
    {
        Product product = db.Producten.Find(id);
        Product newProduct = new Product();
        if (product == null)
        {
            throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound));
        }
        else
        {
            product.Categorien = null;
        }
        newProduct.Id = product.Id;
        newProduct.Naam = product.Naam;
        newProduct.Omschrijving = product.Omschrijving;
        newProduct.Plaatje = product.Plaatje;
        newProduct.Prijs = product.Prijs;
        newProduct.Categorien = product.Categorien;
        return newProduct;
    }

最初の問題:カテゴリがある限り、商品を送信できません。私はそれをnullにする必要があります。2番目の問題:最初の問題のため、元の製品を送信できません。

4

1 に答える 1

1

カテゴリは複数の製品を参照し、製品は複数のカテゴリを参照するため、シリアル化中の循環参照に問題があると想定しています。1 つの解決策は、EF に使用しているストレート エンティティを返す代わりに、データ転送オブジェクト (DTO)を使用することです。エンティティを DTO に簡単にマップできるようにするために、AutoMapperを使用します。これは基本的に、REST API メソッドで newProduct のインスタンスを作成するときに行っていることですが、AutoMapper を使用すると、ハード コーディングと面倒な作業がマッピングから取り除かれます。製品の DTO は非常に似ていますが、仮想ナビゲーション プロパティや EF に必要な属性はありません。製品の DTO は次のようになります。

public class Categorie
{
    public int Id { get; set; }
    public string Naam { get; set; }
    public string Omschrijving { get; set; }
    public byte[] Plaatje { get; set; }
}

public class Product
{
    public int Id { get; set; }
    public string Naam { get; set; }
    public string Omschrijving { get; set; }
    public double Prijs { get; set; }
    public List<Categorie> categorien = new List<Categorie>();

    public List<Categorie> Categorien
    {
        get { return categorien; }
        set { categorien = value; }
    }
    public byte[] Plaatje { get; set; }
}

この場合、製品のリストが必要なため、Category の DTO には製品のリストが含まれていないことに注意してください。DTO のフィールド名をエンティティと同じにしておくと、AutoMapper がマッピングを自動的に処理します。通常、DTO には同じクラス名を使用し、別の名前空間を持つことでエンティティと区別しています。REST API メソッドは次のようになります。

// GET api/Rest/5
public Product GetProduct(int id)
{
    Product product = db.Producten.Find(id);
    return Mapper.Map<Product, Dto.Product>(product);
}
于 2012-10-29T18:06:44.817 に答える