Jeśli zapytań INSERT są ANSI SQL lub nie dbają o wspieranie baz Nieograniczone równoczesne ze swoim kodzie, nadal masz backdoora do tworzenia dostawcy ADO.NET z EF i wykonać trochę surowego SQL wywołań
https://stackoverflow.com/a/1579220/98491
chciałbym zrobić coś takiego
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);
}
muszę przyznać, że jej nie testowane, ale powinno to być szybki i brudny sposób ominąć EF dla niektórych masowych wstawki aż Duże wkładki są częścią jądra .
Aktualizacja
Tylko szybki pomysł. Czy wypróbowałeś metodę ... z przestrzeni nazw Migrations? Może to się robi wkładki luzem, nie patrzeć na to, ale warto spróbować:
private void BatchInsert(IEnumerable<Person> persons)
{
context.Persons.AddOrUpdate(persons);
}
wiem, ta metoda może być powolna jeśli zdefiniować kolumnę klucza jak AddOrUpdate(p => p.Firstname, persons)
ale przypuszczam bez specifing go , które powinny być wszystkie wkładki (nie gwarantowane)
pomocą SqlBulkCopy API – ErikEJ
możliwie duplikat [najszybszy sposób umieszczania w jednostce ram] (http://stackoverflow.com/questions/5940225/fastest-way-of-inserting-in-entity-framework) –
Struktura Entity jest bardzo powolna. Znalazłem sposób, aby zrobić to znacznie szybciej. Zasadniczo wstawiasz luzem do tabeli tymczasowej, a następnie wywołuje scalanie stamtąd do głównej tabeli. Wyjaśniłem technikę na moim blogu tutaj: http://www.jarloo.com/c-bulk-upsert-to-sql-server-tutorial/ Opisuje technikę i pokazuje kod, jak to zrobić. – Kelly