C# 使用LINQ查询向数据库表插入多行

C# 使用LINQ查询向数据库表插入多行,c#,asp.net-mvc,linq,asp.net-mvc-3,razor,C#,Asp.net Mvc,Linq,Asp.net Mvc 3,Razor,我正在尝试将所有Ith值插入名为AB_Product\u vs_字段的表中,但它只插入最后一个I值 这就是LINQ查询 for (int i = 0; i < product.ListProductFields.Count; i++) { insertproductvalue.Product_ID = product.Product_ID; insertproductvalue.Field_ID = product.ListProductFields[i].ProductFie

我正在尝试将所有
I
th值插入名为
AB_Product\u vs_字段的表中
,但它只插入最后一个
I

这就是LINQ查询

for (int i = 0; i < product.ListProductFields.Count; i++)
{
   insertproductvalue.Product_ID = product.Product_ID;
   insertproductvalue.Field_ID = product.ListProductFields[i].ProductFieldID;
   insertproductvalue.Field_Value_EN = product.ListProductFields[i].Field_Value_EN;                         
};

db.AB_Product_vs_Field.Add(insertproductvalue);
db.SaveChanges();
for(int i=0;i

如何一行一行地插入所有这些行

您只需将该行插入即可:

db.AB_Product_vs_Field.Add(insertproductvalue);

在for中,将save保存在for之外。

我看不出如何创建
insertproductvalue
,但我认为您的代码应该如下所示:

var listInsertproductvalue = new List<AB_Product_vs_Field>(); //you creating list of your entities
for (int i = 0; i < product.ListProductFields.Count; i++)
{
   listInsertproductvalue.Add(new AB_Product_vs_Field 
   {
      Product_ID = product.Product_ID, 
      Field_Value_EN = product.ListProductFields[i].Field_Value_EN
   }); //here you create your entity and add it to List
};
db.AB_Product_vs_Field.AddRange(listInsertproductvalue); //here you add all new entities to context
db.SaveChanges();
var listInsertproductvalue=new List()//您正在创建实体的列表
for(int i=0;i

在这里,您创建实体的空
列表
,填充它,然后使用
AddRange()
方法将列表添加到您的上下文中。

我在这里假设几件事,但它有一个非常短而甜美的方法。我有点盲目,因为我需要更多关于代码的信息,即变量声明

假设
product.ListProductFields
是某个对象的
列表,其中包含所有要插入的行:

第一种方式:

product.ListProductFields.Foreach(objEach=>{
db.AB_Product_vs_Field.Add((objEach); /* First we can get, .productId, .FeildId etc inside the function*/
// OR 
// db.AB_Product_vs_Field.Add((objEach.Product_ID, objEach.ProductFieldID, objEach.Field_Value_EN;);

});
db.SaveChanges();
还有一种更简单的方法,就是创建一个
列表
,其中是自定义类对象的列表,每个对象都将添加属性,并且该对象将添加到自定义类对象的列表中,然后我们可以再次使用上面的代码将行插入数据库

第二种方式:

var lstinsertproductvalue=new List<<*CLASSTYPE*>>();
for (int i = 0; i < product.ListProductFields.Count; i++)
            {
insertproductvalue=new <<*CLASSTYPE*>>();
                insertproductvalue.Product_ID = product.Product_ID;
                insertproductvalue.Field_ID = product.ListProductFields[i].ProductFieldID;
                insertproductvalue.Field_Value_EN = product.ListProductFields[i].Field_Value_EN;
lstinsertproductvalue.Add(insertproductvalue); 
// Here you have created a list your-self assuming that product.ListProductFields is not a list. 
            };

lstinsertproductvalue.Foreach(objEach=>{
db.AB_Product_vs_Field.Add((objEach); /* First we can get, .productId, .FeildId etc inside the function*/
// OR 
// db.AB_Product_vs_Field.Add((objEach.Product_ID, objEach.ProductFieldID, objEach.Field_Value_EN;);    
});
db.SaveChanges();
var lstinertproductvalue=new List();
for(int i=0;i{
db.AB_Product_vs_Field.Add((objEach);/*首先,我们可以在函数中获得.productId.FeildId等*/
//或
//db.AB_Product_vs_Field.Add((objEach.Product_ID,objEach.ProductFieldID,objEach.Field_Value_EN;);
});
db.SaveChanges();

Put
db.AB\u Product\u vs\u字段。Add(insertproductvalue);
for
循环中(您当前只添加了最后一个)。并且您确实应该在
for
循环中初始化
insertproductvalue
的新实例。@StephenMuecke然后我得到这个SystemInvalidOperationException:
{“属性'Field_ID'是对象关键信息的一部分,不能修改。”}
如果它是PK字段,请删除
insertproductvalue.Product_ID=Product.Product_ID;
(保存时会自动生成)-或者您正在编辑现有对象?
Product\u ID
Field\u ID
是这里的复合主键,这些是varchar字段,用户必须使用前端视图页面插入
Product\u ID
Field\u ID
在查看页面
@Html.HiddenFor(m=>m.ListProductFields[i].ProductFieldID)
一旦我使用了您的解决方案,它的保存最后一个
I
th值,我检查了两次,用DB,我应该怎么做do@kez我更新了答案。您始终可以创建实体列表,然后使用AddRange。@teovankot在这个代码段中,我定义了insertproductvalue对象,如下所示t_vs_Field();
。我可以在这里使用该对象而不是
var listInsertproductvalue=new List();
吗?一旦我使用了您的解决方案,它的最后一次保存
I
th值请尝试在for上保存更改。这样可以解决问题。调用
db.SaveChanges();
在每个实体上添加。获取此错误
'IList'不包含'Foreach'的定义,并且找不到接受'IList'类型的第一个参数的扩展方法'Foreach'。
@kez;请您也给我变量声明的完整相关代码,因为它将真正帮助我更新您的属性rly.@teovankot;谢谢,我忘了把它带到外面去了。我已经相应地更新了代码。@kez:你可以试试第二种方法,我觉得可能会发生这个错误,所以我只编辑了这篇文章,并保留了第二种方法。