簡體   English   中英

如何使用 for each 將多個對象添加到數據庫中

[英]How do i add more than one objects to a database using for each

我需要使用不同的 Sku 代碼多次將 object 添加到數據庫中。

我在 for each 循環中更改了 Sku 代碼,但我不知道如何以相同的方法將產品添加到數據庫中而不會出現此錯誤, 錯誤 我想我可能需要讓它異步但不知道如何。

這是代碼

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

在你的方法中,我會做三件事。

  1. 您應該在 using 語句中創建上下文。

  2. 將保存更改 function 移到 for 循環之外。

  3. 在循環中創建您的 p1 。

請參閱以下更改:

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();

您還可以進行其他更改,但我看到的最大更改是只有一個產品參考 同一產品 object 在循環中多次添加到product集合中。 每次,循環也會設置一個新的 Sku... 但由於它們都是相同的 object ,因此來自循環先前迭代的引用反映了新數據。

要解決此問題,每次循環都需要一個新產品 object。 您可以通過將db.SaveChanges()調用移到循環之后來抵消該性能。

我認為您的問題是當您嘗試調用 Savechanges() 來生成另一個事務時,您的 foreach 循環正在循環期間評估查詢。

如果您只是在最后將 SizeList 和 Product 查詢更改為 have.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();
    } 
}

感謝您的幫助,我在 for each 中創建了一個新的 object,更改了新 object 中的 sku,我忘了我需要給產品一個尺寸,所以我在同一個循環中的 Z83C8324F192E752DE4EA9C519ZD 中做了這個並將其添加到 DB27DE4EA9C519Z5一個產品列表,然后將每個產品循環到另一個產品列表中並添加到數據庫中,它可以通過重構來完成,但現在就可以了,再次感謝大家

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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM