EntityFramework.BulkInsert вызывает проблемы со вставкой в ​​базу данных

Я пытаюсь использовать библиотеку 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 знает, почему у нас возникла эта проблема.


person Jason    schedule 26.08.2014    source источник
comment
У меня такая же проблема   -  person Luca Morelli    schedule 01.08.2015


Ответы (2)


Итак, после некоторого времени попыток решить проблему решение было довольно простым. Те же правила применяются к SqlBulkCopy, где должна быть вставлена ​​каждая таблица, а не только таблица, которая имеет ссылки на другие таблицы (через внешние ключи). Зато очень быстро!

person Jason    schedule 27.08.2014
comment
не могли бы вы объяснить свое решение? - person Muds; 04.06.2015
comment
Это означает, что в EF вы можете назначить объект, представляющий таблицу. Проблема заключалась в том, что для работы массовой вставки вам необходимо фактически сохранить изменения в таблицах, на которые вы ссылаетесь, прежде чем выполнять какую-либо массовую вставку. - person Jason; 01.07.2015
comment
Извините, но я не совсем понимаю ваш ответ здесь. У меня есть основная таблица с именем Contacts, а ее столбец Id является внешним ключом в другой таблице с именем ContactExtras. Как я могу сообщить моему BulkInsert, что мы имеем дело с внешними ключами? Я разместил свой вопрос здесь: stackoverflow.com/questions/32225183/ Было бы здорово, если бы вы могли взглянуть. - person disasterkid; 26.08.2015
comment
@Pedram Проблема, с которой я столкнулся, заключалась в том, что новая запись с идентификатором еще не была сохранена. Таким образом, EF понятия не имел, как их соединить, не сохранив сначала эту новую запись. Таким образом, в вашем случае, если вы массово вставляете в таблицу ContactExtras, вам необходимо сначала сохранить изменения в таблице контактов, прежде чем назначать ее ContractExtras. Итак, Contact bob = new Contact(); /*Выполняем действия с новым контактом */ db.SaveChanges(); //Теперь вы можете ссылаться на этот объект в массовой вставке. - person Jason; 27.08.2015

Мне удалось решить эту проблему, создав проект Code First EF6. Это решение, но сначала было бы неплохо иметь модель.

person user3980169    schedule 26.08.2014