如何为数据库使用多个对象

时间:2020-04-06 16:46:24

标签: c# linq foreach

我需要使用一个不同的Sku代码多次向数据库添加对象。

我为每个循环更改了Sku代码,但是我不知道如何以相同的方法将产品添加到数据库中,而不会出现此错误, Error 我认为我可能需要使其异步,但不确定如何。

这是代码

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 个答案:

答案 0 :(得分:2)

在您采用的方法中,我将做三件事。

  1. 您应该在using语句中创建上下文。

  2. 将保存更改功能移至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();

答案 1 :(得分:1)

您还可以进行其他更改,但是我看到的最大变化是只有一个产品参考。相同的产品对象会循环多次添加到product集合中。每次循环还会设置一个新的Sku ...,但是由于它们都是相同的对象,因此循环以前迭代的引用会反映新数据。

要解决此问题,每次循环时都需要一个新的产品对象。您可以通过在循环之后将db.SaveChanges()调用移到 来抵消性能。

答案 2 :(得分:1)

我认为您的问题在于,当您尝试调用想要生成另一笔交易的Savechanges()时,您的foreach循环正在循环期间评估查询。

如果仅将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();
    } 
}

答案 3 :(得分:0)

感谢您的帮助, 我在中为每个对象创建了一个新对象,更改了新对象中的sku,我忘了给产品指定尺寸,所以我在同一循环中的linq查询中这样做,并将其添加到产品列表中,即产品然后将它们循环遍历并添加到数据库中,它可以进行重构,但现在可以进行,再次感谢大家

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();
相关问题