2016-02-25 2 views
0

Обычно в моем предыдущем проекте, я могу сделать массовой вставки, передавая список объекта как код нижеМассовая вставка рамки сущность данных 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(); 
    } 

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

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

+0

Исключение, которое вы получаете, говорит о том, что вы нарушаете свой ключ для таблицы. Почему бы вам не исправить это первым. Кроме того, что такое большие объемы данных. Как если бы я вызывал ApplicationUserRole ... в моем systsem, возможно, не было бы более 1000 ролей. так много данных, о чем мы говорим здесь ... 1000 ролей, добавленных таким образом, занимают менее 1 секунды. – Seabizkit

+0

Привет, Seabizkit это только один из примеров. Мне все еще нужна дополнительная таблица для вставки. И да, я знаю, это ключевая ошибка. Но какое решение? Пожалуйста, не спрашивайте, почему не Google. У меня был гуглинг в течение нескольких часов и до сих пор нет решения. Спасибо – user998405

+0

эй человек ... здесь, чтобы помочь. решение ... проверьте данные ... найдите место, где эти ApplicationUserRole добавлены в List ... показывая, что код поможет. Также покажите класс для ApplicationUserRole, чтобы я мог видеть, что составляет KEY. Массовые вставки - это другой вопрос, который я чувствую и второстепенен этому. Может быть, вы могли бы задать это как отдельный вопрос. Ключ к его быстрому выполнению ... попробуйте создать контекст на единицу работы (UOW). UOW может быть небольшим ... чем больше контекст становится тем медленнее, что он получает ... просто имейте это в виду. – Seabizkit

ответ

0

Сообщение об исключении, которое вы видели, не может быть исправлено, вызвав «SaveChanges» после каждого добавления. Основная причина вашей проблемы заключается в том, что ваш экземпляр DbContext уже имеет объект ApplicationUserRole с тем же ключом (предполагая, что это ApplicationUserRole.Id или что-то еще). This error is common и часто вызвано вручную установкой временных значений ключа, например. настройка 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(); 
    }   
} 
Смежные вопросы