Я пытаюсь использовать библиотеку EntityFramework.BulkInsert для использования EF6 и SqlBulkCopy.
Документация кажется очень прямой, однако я не могу получить данные, занесенные в базу данных.
Для сложного примера здесь приведен код:
public void WriteChunkNoAsync(int chunkCount, bool forceSave = false)
{
Chunking.Entities.Add(this);
if (forceSave || Chunking.Entities.Count % chunkCount == 0)
{
using (var db = new FlatESContainer())
{
//db.Entity.AddRange(Chunking.Entities); //This will work
db.BulkInsert(Chunking.Entities);
Chunking.Entities = new List<Entity>();
db.SaveChanges();
}
}
}
Этот код будет в основном вставляться в глобальный список, пока счетчик списка не будет делиться на chunckCount.
Функция AddRange работает нормально. Итак, мы решили создать очень простую базу данных с одной таблицей «Тест», и вот проблема, с которой мы столкнулись:
List<Test> tests = new List<Test>();
for (int i = 0; i < 1000; i++)
{
tests.Add(new Test());
}
using (var context = new SimpleContainer())
{
//This works fine
context.Tests.AddRange(tests);
//This causes an exception: Type 'TestSimpleDatabase.Test' is not found in context 'TestSimpleDatabase.SimpleContainer'
context.BulkInsert(tests);
context.SaveChanges();
}
Я считаю, что это отдельные проблемы, но, возможно, кто-то из сообщества stackoverflow имеет представление о том, почему у нас возникает эта проблема.
Итак, через некоторое время, пытаясь решить проблему, решение было довольно прямолинейным. Те же правила применяются для SqlBulkCopy, где должна быть вставлена каждая таблица, а не только таблица, имеющая ссылки на другие таблицы (через внешние ключи). Очень быстро!