2017-07-26 146 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

对不起,我想拥有多对多 –