Как мне добавить более одного объекта в базу данных, используя для каждого - PullRequest
0 голосов
/ 06 апреля 2020

Мне нужно несколько раз добавить объект в базу данных с другим кодом Sku.

У меня меняется код Sku для каждого l oop, но я не знаю, как добавить продукты в базу данных тем же способом без получения этой ошибки, Error я думаю, что мне может понадобиться сделать асин c, но не знаю как.

вот код

public static PetersContext db = new PetersContext();
    static void Main(string[] args)
    {
        var sizeList = from ProductSizes in db.Sizes
                       where ProductSizes.SizeScale == 1//product.SizeScale.SizeScaleId
                       select (ProductSizes.SizeDesc);

        var products = from Product in db.Products
                       select Product;

        Product p1 = new Product()
        {
            ProductBrand = 1,
            ProductCode = "Ts102",
            CostPrice = 1,
            SellPrice = 2,
            ProductDescription = "Ted Smith Shirt",
            ProductSeason = 1,
            ProductType = 1,
        };
        foreach (var size in sizeList)
        {
            p1.ProductSkus = (p1.ProductCode + p1.ProductBrand.ToString() + p1.ProductColour.ToString() + size.ToString());

            Console.WriteLine(p1.ProductSkus);
            db.Products.Add(p1);
            db.SaveChanges();
        }

        Console.ReadLine();
    }
}

Ответы [ 4 ]

2 голосов
/ 06 апреля 2020

Есть три вещи, которые я бы сделал по-другому в вашем подходе.

  1. Вы должны создать свой контекст в операторе использования.

  2. Переместить функцию сохранения изменений за пределы вашей для l oop.

  3. Создайте свой p1 в пределах l oop.

См. Изменения ниже:

using(var db = new PetersContext()) //open connection
{
    var sizeList = from ProductSizes in db.Sizes
                   where ProductSizes.SizeScale == 1//product.SizeScale.SizeScaleId
                   select (ProductSizes.SizeDesc);

    var products = from Product in db.Products
                   select Product;


    foreach (var size in sizeList)
    {
        Product p1 = new Product() //Moving to inside of loop creates new instance every time
        {
            ProductBrand = 1,
            ProductCode = "Ts102",
            CostPrice = 1,
            SellPrice = 2,
            ProductDescription = "Ted Smith Shirt",
            ProductSeason = 1,
            ProductType = 1,
        };
        p1.ProductSkus = (p1.ProductCode + p1.ProductBrand.ToString() + p1.ProductColour.ToString() + size.ToString());

        Console.WriteLine(p1.ProductSkus);
        db.Products.Add(p1);
    }
    db.SaveChanges(); //save changes after everything is done.
}                                                          
Console.ReadLine();
1 голос
/ 06 апреля 2020

Я думаю, что ваша проблема в том, что ваш foreach l oop оценивает запрос в течение l oop, когда вы пытаетесь вызвать Savechanges (), которая хочет сгенерировать другую транзакцию.

Если вы просто измените запросы SizeList и Product на .ToList () в конце, это вызовет оценку, и тогда вы будете использовать списки в foreach, а не транзакционный запрос.

Обновлен, чтобы отразить комментарии:

Глядя на ваш код, вы видите, что ProductSku является свойством Product. Возможно, вам следует подумать о том, чтобы сделать SKU отдельной таблицей, чтобы вам не нужно было повторять все стандартные свойства продукта. Однако, чтобы дать то, о чем я думаю, вы просите, вам нужно что-то вроде этого:

static void Main(string[] args)
{
    using (PetersContext db = new PetersContext()) {
        var sizeList = from ProductSizes in db.Sizes
                       where ProductSizes.SizeScale == 1//product.SizeScale.SizeScaleId
                       select (ProductSizes.SizeDesc);

        var products = from Product in db.Products
                       select Product;

        foreach (var size in sizeList)
        {
            foreach (var product in products)
            {
                Product newProduct = new Product()
                {
                    ProductSkus = (product.ProductCode + product.ProductBrand.ToString() + product.ProductColour.ToString() + size.ToString()),
                    ProductBrand = product.ProductBrand,
                    ProductCode = product.ProductCode,
                    CostPrice = product.CostPrice,
                    SellPrice = product.SellPrice,
                    ProductDescription = produce.ProductDescription,
                    ProductSeason = product.ProductSeason,
                    ProductType = product.ProductType
                };
                Console.WriteLine(p1.ProductSkus);
                db.Products.Add(newProduct);
            }
        }
        db.SaveChanges();

        Console.ReadLine();
    } 
}
1 голос
/ 06 апреля 2020

Есть и другие изменения, которые вы можете внести, но я вижу одно большое: , есть только одна ссылка на продукт . Один и тот же объект продукта добавляется в коллекцию product несколько раз в al oop. Каждый раз l oop также устанавливает новый Sku ... но поскольку все они являются одним и тем же объектом , ссылки с предыдущих итераций l oop отражают новые данные.

Чтобы это исправить, вам каждый раз нужен новый объект продукта через l oop. Вы можете компенсировать эту производительность, переместив вызов db.SaveChanges() на после l oop.

0 голосов
/ 06 апреля 2020

Спасибо за помощь, я создал новый объект в для каждого, изменил sku в новом объекте, я забыл, что мне нужно задать размер продуктов, поэтому я сделал это в запросе linq в том же l oop и добавили его в список продуктов, продукт затем перебрал в другом для каждого и добавил в БД, это можно было бы сделать с рефакторингом, но это будет делать, спасибо еще раз, ребята

public static PetersContext db = new PetersContext();
    static void Main(string[] args)
    {
        var sizeList = from ProductSizes in db.Sizes
                       where ProductSizes.SizeScale == 1//product.SizeScale.SizeScaleId
                       select (ProductSizes.SizeDesc);

        var sizeIdList = from ProductSizes in db.Sizes
                         where ProductSizes.SizeScale == 1
                         select (ProductSizes.SizeId);

        var products = from Product in db.Products
                       select Product;

        Product p1 = new Product()
        {
            ProductBrand = 1,
            ProductCode = "Ts102",
            CostPrice = 27,
            SellPrice = 79,
            ProductDescription = "Ted Smith Shirt",
            ProductSeason = 1,
            ProductType = 1,
            ProductColour=1
        };
        IList<Product> newProductList = new List<Product>();
        foreach (var size in sizeList)
        {

            string newSku = (p1.ProductCode + p1.ProductBrand.ToString() + p1.ProductColour.ToString() + (size.ToString()));
            Product newProduct = new Product()
            {
                ProductBrand = p1.ProductBrand,
                ProductCode = p1.ProductCode,
                CostPrice = p1.CostPrice,
                SellPrice = p1.SellPrice,
                ProductDescription = p1.ProductDescription,
                ProductSeason = p1.ProductSeason,
                ProductType = p1.ProductType,
                ProductColour = p1.ProductColour,
                ProductSkus= newSku,
            };
                newProduct.ProductSkus = newSku;

                var SizeId =(from ProductSize in db.Sizes
                                         where ProductSize.SizeDesc == size
                                          select ProductSize.SizeId).First();
            newProduct.ProductSize = SizeId;

            newProductList.Add(newProduct);
        }
        foreach (var product in newProductList)
        {

            db.Products.Add(product);
            db.SaveChanges();
        }
        Console.ReadLine();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...