我需要使用一个不同的Sku代码多次向数据库添加对象。
我为每个循环更改了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();
}
}
答案 0 :(得分:2)
在您采用的方法中,我将做三件事。
您应该在using语句中创建上下文。
将保存更改功能移至for循环之外。
在循环中创建您的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();