public ProductEntity Convert(Product product)
        {
            ProductEntity productEntity = daoFactory.ProductEntityDAO.Get(product.Id);

            if (productEntity == null)
            {
                productEntity = entityFactory.CreateProductEntity();
            }
            productEntity.Name  = product.Name;
            productEntity.Price = product.Price;
            productEntity.Sku   = product.Sku;


            productEntity.ProductTagEntities = new List <ProductTagEntity>();
            productEntity.StockEntities      = new List <StockEntity>();

            product.Tags.ForEach(tag =>
            {
                ProductTagEntity ptEntity = daoFactory.ProductTagDAO.Get(product.Id, tag.Id) ??
                                            entityFactory.CreateProductTagEntity(product.Id, tag.Id, this.daoFactory);
                productEntity.ProductTagEntities.Add(ptEntity);
            });

            product.Stocks.ForEach(stock =>
            {
                StockEntity stockEntity = daoFactory.StockEntityDAO.Get(stock.Id);
                if (stockEntity == null)
                {
                    throw new InvalidDataException("Stock not found. Please first create this stock.");                      // ?
                }
                productEntity.StockEntities.Add(stockEntity);
            });

            return(productEntity);
        }
        private ProductTagEntity GetProductTagEntity(int productId, int tagId)
        {
            ProductTagEntity ptEntity = daoFactory.ProductTagDAO.Get(productId, tagId);

            if (ptEntity == null)
            {
                ptEntity = entityFactory.CreateProductTagEntity(productId, tagId, this.daoFactory);
            }
            return(ptEntity);
        }
        public TagEntity Convert(Tag tag)
        {
            TagEntity tagEntity = daoFactory.TagEntityDAO.Get(tag.Id);

            if (tagEntity == null)
            {
                tagEntity = entityFactory.CreateTagEntity();
            }
            tagEntity.Name = tag.Name;
            tag.Products.ForEach(product =>
            {
                ProductTagEntity productTagEntity = GetProductTagEntity(product.Id, tag.Id);
                if (!tagEntity.ProductTagEntities.Contains(productTagEntity))
                {
                    tagEntity.ProductTagEntities.Add(productTagEntity);
                }
            });

            return(tagEntity);
        }