如果您的插入查询是 ANSI SQL,或者您不关心使用您的代码库支持多数据库,您仍然有后门可以从 EF 创建 ADO.NET 提供程序并执行一些原始 SQL 调用
https://stackoverflow.com/a/1579220/98491
我会做这样的事情
private void BulkInsert(IEnumerable<Person> Persons)
{
// use the information in the link to get your connection
DbConnection conn = ...
using (DbCommand cmd = conn.CreateCommand())
{
var sb = new StringBuilder();
sb.Append("INSERT INTO person (firstname, lastname) VALUES ");
var count = 0;
foreach(var person in persons)
{
if (count !=0) sb.Append(",");
sb.Append(GetInsertCommand(person, count++, cmd));
}
if (count > 0)
{
cmd.CommandText = sb.ToString();
cmd.ExecuteNonQuery();
}
}
if (sb.Length > 0)
ExecuteNonQuery(sb.ToString());
}
private string GetInsertCommand(Person person, int count, DbCommand cmd)
{
var firstname = "@firstname" + count.ToString();
var lastname = "@lastname" + count.ToString();
cmd.Parameters.Add(firstname, person.Firstname);
cmd.Parameters.Add(lastname, person.Firstname);
return String.Format("({0},{1})", firstname, lastname);
}
我必须承认我没有测试过它,但这应该是一种快速而肮脏的方法,可以绕过某些 Bulk Inserts 的 EF,直到 Bulk inserts 成为核心的一部分。
更新
只是一个快速的想法。您是否尝试过 Migrations 命名空间中的 ... 方法?
也许这个做批量插入,还没有研究过,但值得一试:
private void BatchInsert(IEnumerable<Person> persons)
{
context.Persons.AddOrUpdate(persons);
}
我知道如果您定义像 AddOrUpdate(p => p.Firstname, persons) 这样的 Key 列,此方法可能会很慢,但我猜如果不指定它,那应该是所有插入(不保证)