C# 插入批量记录。也许是SQL
我在表C# 插入批量记录。也许是SQL,c#,entity-framework,C#,Entity Framework,我在表ButtonUsers中有一个包含用户列表的按钮。父按钮随用户列表更新,所有其他按钮的用户列表都应更新。并非每次都是这样,因此每个按钮都有自己的列表。 问题是我可能有5000个按钮,每个按钮都应该更新 我尝试一次拉动所有按钮,然后拉动用户,并将每个按钮的状态设置为修改。当我遍历所有按钮后,调用SaveChanges() public bool updateprevious按钮(按钮按钮,列表用户列表) { var buttons=fieldRepo.GetFieldsCreatedFrom
ButtonUsers
中有一个包含用户列表的按钮。父按钮
随用户列表更新,所有其他按钮的用户列表
都应更新。并非每次都是这样,因此每个按钮都有自己的列表。
问题是我可能有5000个按钮,每个按钮都应该更新
我尝试一次拉动所有按钮,然后拉动用户,并将每个按钮的状态设置为修改。当我遍历所有按钮后,调用SaveChanges()
public bool updateprevious按钮(按钮按钮,列表用户列表)
{
var buttons=fieldRepo.GetFieldsCreatedFrom(button.ID);
var users=fieldRepo.GetUsersFromIDs(userList);
foreach(var btn in按钮)
{
btn.UserList=用户;
fieldRepo.UpdateFieldGeneric(btn);
}
返回fieldRepo.Commit();
}
问题似乎在于它不会批量插入记录,而是每次调用插入一条记录。这不可避免地会导致暂停,并且需要很长时间
我一直在考虑使用
Context.Database.ExecuteSqlCommand()
手动执行。使用实体框架有更好的方法吗?您可以尝试使用SqlBulkCopy类:
作为如何使用它的简单示例:
var data = new DataTable();
data.Columns.Add("Name");
data.Columns.Add("Id");
for (var i = 1; i< 10_000; i++)
{
data.Rows.Add($"Name={i+1}", i+1);
}
using (var sqlBulk = new SqlBulkCopy(_connectionstring))
{
sqlBulk.DestinationTableName = "People";
sqlBulk.WriteToServer(data);
}
var data=new DataTable();
数据。列。添加(“名称”);
数据。列。添加(“Id”);
对于(变量i=1;i<10_000;i++)
{
Add($“Name={i+1}”,i+1);
}
使用(var sqlBulk=newsqlbulkcopy(_connectionstring))
{
sqlBulk.DestinationTableName=“People”;
sqlBulk.WriteToServer(数据);
}
ORM(如EF)通常基于每个对象工作;像SqlBulkCopy
这样的工具已经存在(如果需要,可以与原始对象一起使用),但它们的保证较少(“ACID”等);您通常必须相当手动地实现这些事情。或者,可以考虑“表值参数”,它看起来像是可行的。谢谢你的例子哇,真的很快,谢谢你。作为奖励,是否有类似的方法来删除当前记录,以便不留下旧数据?据我所知,SqlBulkCopy只是插入,此线程讨论了处理更新等需求的方法:
var data = new DataTable();
data.Columns.Add("Name");
data.Columns.Add("Id");
for (var i = 1; i< 10_000; i++)
{
data.Rows.Add($"Name={i+1}", i+1);
}
using (var sqlBulk = new SqlBulkCopy(_connectionstring))
{
sqlBulk.DestinationTableName = "People";
sqlBulk.WriteToServer(data);
}