2017-07-26 2 views
0

J'ai les modèles suivants: Qui a de nombreuses relations.Ajouter une nouvelle entrée Cadre d'entité Mappage de relations plusieurs à plusieurs

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; } 

    } 

Et je veux ajouter de nouveaux produits avec des catégories existantes, mais quand j'ajouter de nouveaux produits i crée également de nouvelles catégories aussi sans utilisation des ressources existantes.

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) 
      { 

      } 
     } 

Ici, je souhaite ajouter un nouveau produit avec des catégories existantes. Comment puis-je trier cette chose?

+1

Il s'agit d'un problème très courant dont vous devriez pouvoir trouver de nombreuses questions et réponses. –

Répondre

0

peut être

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) 
     { 

     } 
    } 

S'il vous plaît pas que le foreach mon être remplacé par une seule requête

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

Bien sûr comme suggéré par Gert Arnold, il existe de nombreuses variantes, par exemple en utilisant Attach ....

+0

Parfait cela a fonctionné !!!! Comment puis-je vous évaluer ici. –

+0

pas sûr de comprendre .. cherchez-vous le bouton upvote? – tschmit007

+0

ya je t'ai voté. Merci beaucoup –

0

Selon vos entités, les classes Product et ProductCategory sont créées avec de nombreuses relations. Essayez ceci dans ProductCategory et vérifiez

Essayez ceci:

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

ya désolé je veux avoir beaucoup à beaucoup –