【问题标题】:Add new entry Entity framework many to many relationship mapping添加新条目实体框架多对多关系映射
【发布时间】:2018-01-01 19:10:52
【问题描述】:

我有以下模型:具有多对多关系。

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

            }
        }

在这里,我想添加具有现有类别的新产品。 我该如何解决这个问题?

【问题讨论】:

  • 这是一个很常见的问题,你应该可以找到很多问题和答案。

标签: .net entity-framework model-view-controller mapping


【解决方案1】:

根据您的实体 Product 和 ProductCategory 类是通过多对多关系创建的。在 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; }

}

【讨论】:

    【解决方案2】:

    可能

    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....

    【讨论】:

    • 不太明白.. 你在找点赞按钮吗?
    猜你喜欢
    • 1970-01-01
    • 2017-02-14
    • 2015-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-01
    相关资源
    最近更新 更多