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