2017-02-22 2 views
1

ユーザーはCategoryオブジェクトを作成できるCMSシステムを使用しています。作成したカテゴリをクリックしてProductオブジェクトを追加できます。ユーザーが製品をブラウズしているときにカテゴリをクリックすると、PostIdentを持つCategoryIdが製品インデックスページに送信されます。商品インデックスページでは、渡されたカテゴリIDに一致するカテゴリオブジェクトが取得され、そのカテゴリに属する​​商品リストプロパティが選択され、商品が表示されます。 Category classは、製品のList<Product>という特性を持っています。Productオブジェクトで外部キーとして与えられたCategoryNameのカテゴリに製品を割り当てる

私はCSV data import formを持っています。ユーザーは同じことをすることができますが、1つのCSVファイルをアップロードすることができます。

CSVファイルのデータ(網掛けの灰色)は、製品のリストです。注 - 各製品のカテゴリ名欄(第五影付きの列、すなわち "ホーム"、 "ヒース&美"):

CSV_Data.png

これは、製品とカテゴリのクラスです:

public class Product 
{ 
    public int Id { get; set; } 
    public string Barcode { get; set; } 
    [Required] 
    public string Name { get; set; } 
    public string Description { get; set; } 
    [Required] 
    public Byte[] Image { get; set; } 
    [Required] 
    public Decimal Price { get; set; } 
    [Required] 
    public bool ShowOnIndex { get; set; } 
} 

public class Category 
{ 
    public int Id { get; set; } 
    [Required] 
    public string Name { get; set; } 
    [Required] 
    public Byte[] Image { get; set; } 
    public virtual ICollection<Product> Products { get; set; } 
} 

カテゴリと製品間の関係はSQL ServerのOne-to-Manyです。カテゴリには多くの製品があり、製品には1つのカテゴリしかありません。

次のコードでは、カテゴリリストで正しいカテゴリに製品のリストを保存しようとしています。しかし、私はCSVデータ内の各製品のCategoryIdsを持っていなかったので、ループ内のカテゴリのすべてのIDを手動で収集しています。私は何とか正しいCategory IdProductオブジェクトでCategoryName値と一致するにはどうすればよい

public static async Task SaveProducts() 
{ 
    var CategoryIds = new List<int>(); 

    foreach (var item in CategoriesList) 
    { 
     db.Categories.Add(item); 
     var id = db.Categories.Where(c => c.Name == item.Name).Select(x => x.Id).ToString(); 
     CategoryIds.Add(int.Parse(id)); 
    } 

    foreach (var item in ProductsList) 
    { 
     foreach (var id in CategoryIds) 
     { 
      var category = await db.Categories.FindAsync(id); 
      category.Products.Add(item); 
     } 

    } 

    await db.SaveChangesAsync(); 
} 

答えて

0

は、私は、各製品に彼らが一つのループ内のすべてに属し適切なカテゴリを追加することができることを考え出し、この記事を参照してください、私はこのようにそれをやった:

public static async Task SaveProducts() 
     { 

      foreach (var category in CategoriesList) 
      { 
       foreach (var product in ProductsList) 
       { 

        if (product.CategoryName == category.Name) 
        { 
         category.Products.Add(product); 
        } 
       } 

       db.Categories.Add(category); 
      } 

      await db.SaveChangesAsync(); 
     } 

あなたは、専用エンティティIを見ることができるように毎回カテゴリーオブジェクトcategoryがデータベースに追加されました。 Entity Frameworkはカテゴリと製品の一対一の関係を認識していると考えているため、製品を個別に追加する必要はありませんでした。カテゴリを追加すると、Entity Frameworkは外部キー(ここではCategoriesクラスのリスト) forループがカテゴリリストを反復するたびに、CategoryのProductリスト内にあるすべての製品オブジェクトのデータベース内のProductsエンティティテーブルに新しいProductオブジェクトを追加します。

関連する問題