Массовая вставка объекта данных 7

Обычно в моем предыдущем проекте я могу выполнить массовую вставку, передав список объектов в виде кода ниже

public void Create(List<ApplicationUserRole> item)
{           
        foreach (var data in item)
        {
            _dbContext.ApplicationUserRole.Add(data);
        }
        _dbContext.SaveChanges();           
}

Но пока я продолжаю нажимать на ошибку

InvalidOperationException: экземпляр типа сущности «Docdoc.Models.ApplicationUserRole» не может быть отслежен, поскольку другой экземпляр этого типа с тем же ключом уже отслеживается. Для новых сущностей рассмотрите возможность использования IIdentityGenerator для создания уникальных значений ключа.

Мне нужно изменить мой код ниже, чтобы работать

    foreach (var data in item)
    {
        _dbContext.ApplicationUserRole.Add(data);
        _dbContext.SaveChanges();
    }

Я знаю, что это очень плохая практика. Производительность будет очень низкой при вставке большого объема данных

Любое решение этой проблемы?


person user998405    schedule 25.02.2016    source источник
comment
Исключение, которое вы получаете, говорит о том, что вы нарушаете свой ключ для таблицы. Почему бы вам сначала не исправить это. Кроме того, большие объемы - это данные. Как если бы я звонил ApplicationUserRole... в моей системе у меня, вероятно, не было бы более 1000 ролей. такие большие объемы данных, о чем мы тут говорим... 1000 ролей, добавленных таким образом, займут менее 1 секунды.   -  person Seabizkit    schedule 25.02.2016
comment
Привет, Seabizkit, это только один из примеров. У меня все еще есть другая таблица, которую нужно вставить. И да, я знаю, что это ключевая ошибка. Но каково решение? Пожалуйста, не спрашивайте, почему не Google. У меня было несколько часов поиска в Google, и до сих пор нет решения. Спасибо.   -  person user998405    schedule 25.02.2016
comment
эй человек ... здесь, чтобы помочь. решение... проверьте данные... найдите место, где эти ApplicationUserRole добавляются в List‹ApplicationUserRole›... показ этого кода поможет. Также покажите класс для ApplicationUserRole, чтобы я мог видеть, что составляет КЛЮЧ. Объемные вставки - это другой вопрос, который я чувствую, и он вторичен по отношению к этому. Может быть, вы могли бы задать это как отдельный вопрос. Ключ к быстрой работе... попробуйте создать контекст на единицу работы (UOW). UOW может быть маленьким... чем больше становится контекст, тем медленнее он становится... просто имейте это в виду.   -  person Seabizkit    schedule 25.02.2016


Ответы (1)


Сообщение об исключении, которое вы видели, не может быть исправлено вызовом «SaveChanges» после каждого добавления. Основная причина вашей проблемы заключается в том, что ваш экземпляр DbContext уже имеет сущность ApplicationUserRole с тем же ключом (предположим, что это ApplicationUserRole.Id или что-то в этом роде). Эта ошибка встречается часто и часто вызвано ручной установкой временных значений ключей, например. установка ApplicationUserRole.Id на -1. (См., например, https://github.com/aspnet/EntityFramework/issues/4488. .)

Если ошибка не вызвана неправильной настройкой значений временных ключей, также убедитесь, что ваш экземпляр DbContext недолговечен и используется только в одном потоке. Другими словами, используйте DbContext только для одной операции.

public void Create(List<ApplicationUserRole> item)
{         
    using (var context = new MyContext())
    {  
        context.ApplicationUserRole.AddRange(data);
        context.SaveChanges();  
    }         
}
person natemcmaster    schedule 01.03.2016