2017-07-26 147 views
0

我有以下模型:其中有多對多的關係。添加新條目實體框架多對多關係映射

public class Product 
    { 
     [Key] 
     [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
     public int Id { get; set; } 

     [Required] 
     [MaxLength(50)] 
     public string Name { get; set; } 
     [Required] 
     public string Code { get; set; } 
     [MaxLength(1000)] 
     public string Description { get; set; } 
     public string ImageUrl { get; set; } 
     [Required] 
     public double Price { get; set; }   
     public decimal Cost { get; set; } 
     public bool IsActive { get; set; } 

     public ICollection<ProductCategory> ProductCategories { get; set; } 

    } 

public class ProductCategory 
    { 
     [Key] 
     [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
     public int? Id { get; set; } 

     [Required] 
     [MaxLength(50)] 
     public string Name { get; set; } 
     [Required] 
     public string Code { get; set; } 
     [MaxLength(1000)] 
     public string Description { get; set; } 
     public string CategoryImgeUrl { get; set; } 


     public ICollection<Product> Products { get; set; } 

    } 

我要添加新產品與現有的分類,但是當我添加新的產品,我也沒有使用現有的太創造了新的類別。

public void Add(ProductViewModel vm) 
     { 
      try 
      { 

       if (vm.SelectedCategoryIds.Count() != 0) 
       { 
        var catList = new List<ProductCategoryViewModel>(); 
        foreach (var item in vm.SelectedCategoryIds) { 

         var cat = Context.ProductCategories.Where(c=>c.Id == item).FirstOrDefault(); 
         catList.Add(Mapper.Map<ProductCategoryViewModel>(cat)); 
        } 

        vm.ProductCategories = catList; 

       } 
       var model = Mapper.Map<Product>(vm); 
       model.CreatedDate = DateTime.Now; 
       model.IsDeleted = false; 
       Context.Products.Add(model); 
       Context.SaveChanges(); 
      } 
      catch (Exception ex) 
      { 

      } 
     } 

在這裏,我想添加新的產品與現有的類別。 我如何分類這件事?

+1

這是一個非常常見的問題,您應該能夠找到許多問題和答案。 –

回答

0

可能

public void Add(ProductViewModel vm) 
    { 
     try { 
      var model = Mapper.Map<Product>(vm); 
      model.ProductCategories = new List<ProductCategory>(); 
       //but this should be done by the Product ctor 
      if (vm.SelectedCategoryIds.Count() != 0) { 
       //var catList = new List<ProductCategoryViewModel>(); 
       foreach (var item in vm.SelectedCategoryIds) { 
        var cat = Context.ProductCategories.Where(c=>c.Id == item).FirstOrDefault(); 
        if (cat != null) 
         model.ProductCategories.Add(cat); 
        //catList.Add(Mapper.Map<ProductCategoryViewModel>(cat)); 
       } 
       //vm.ProductCategories = catList; 
      } 
      //var model = Mapper.Map<Product>(vm); 
      model.CreatedDate = DateTime.Now; 
      model.IsDeleted = false; 
      Context.Products.Add(model); 
      Context.SaveChanges(); 
     } 
     catch (Exception ex) 
     { 

     } 
    } 

請不是在foreach我通過單次查詢

foreach (var item in Context.ProductCategories. 
    Where(c=> vm.SelectedCategoryIds.Contains(c.Id))) 
{ 
    model.ProductCategories.Add(item); 
} 

當然被替換正如Gert Arnold所建議的,有很多變體,例如通過使用Attach ....

+0

完美的工作!!!!。我如何評價你在這裏。 –

+0

不確定明白..你在尋找upvote按鈕嗎? – tschmit007

+0

亞我投票給你。謝謝很多 –

0

根據您的實體產品和ProductCategory類創建了多對多的關係。在產品分類試試這個,檢查

試試這個:

public class ProductCategory 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int? Id { get; set; } 

    [Required] 
    [MaxLength(50)] 
    public string Name { get; set; } 
    [Required] 
    public string Code { get; set; } 
    [MaxLength(1000)] 
    public string Description { get; set; } 
    public string CategoryImgeUrl { get; set; } 


    public Product Product { get; set; } 

} 
+0

對不起,我想擁有多對多 –