2013-10-10 2 views
1
protected override void Seed(Fitlife.Domain.Concrete.EFDBContext context) 
    { 
     List<List<string>> foodweights = GetLines(basePath + "FoodWeights.txt"); 
     int counter = 0; 
     foodweights.ForEach(line => 
     { 
      FoodWeights newVal = new FoodWeights() 
      { 
       FoodCode = int.Parse(line[0]), 
        PortionCode = int.Parse(line[1]), 
       PortionWeight = decimal.Parse(line[2]) 
      }; 
      context.FoodWeights.Add(newVal); 

      if (++counter == 1000) 
      { 
       counter = 0; 
       context.SaveChanges();     
      } 
     }); 
} 

Выше метод используется для заполнения моей базы данных. Но для 1000 записей требуется 50 секунд. У меня есть файл с записями 470k, как я могу повысить производительность. Я использую сущность framework, и этот метод вызывается, когда я делаю PM> update-database с менеджером пакетов. Мне нужна аналогичная функциональность, я очень новичок в asp.net и инфраструктуре сущности, любое руководство будет оценено по достоинству.Entity Framework Bulk Load Too Slow Add Seed

PS: Можно ли принимать 50 секунд за 1000 записей, или я делаю что-то неправильно.

+0

К сожалению, EF плохо работает с пакетными/массовыми заданиями. Я бы просто использовал ['SqlBulkCopy'] (http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx), который был разработан для массовых вставок. –

+0

Можете ли вы предоставить мне какой-либо пример, я могу использовать sqlbulkcopy внутри моей функции семени, я хочу по-прежнему использовать команду диспетчера пакетов, например, PM> update-database –

+0

Сколько записей содержится в файле FoodWeights.txt? Я вижу, что вы сохраняете каждые 1000 строк. Похоже, он все равно будет прокручивать весь ваш файл, что может занять довольно много времени, если FoodWeights.txt - большой файл. – jsmith

ответ

1

Метод Seed запускается каждый раз, когда приложение запускается, поэтому, как вы его закодировали, он будет снова и снова добавлять FoodWeight. EF предоставили AddOrUpdate в качестве удобного метода для предотвращения этого, но он действительно не подходит для объемных вставок.

Вы можете использовать sql непосредственно в базе данных - и если вы используете SQL-сервер, то sql может быть 'BULK INSERT'.

Я бы поставил SQL в миграции, потому что вы, вероятно, только запустить вставку сразу из известного состояния, и это избавляет от необходимости беспокоиться об эффективности контекстных и отслеживания изменений и т.д.

Там это пример кода и дополнительная информация здесь: how to seed data using sql files

+0

Спасибо за советы, я использовал SqlBulkInsert и быстро, я перенесу семя в миграцию, но в чем цель моей функции расширенного семени, есть ли у нее удобство. –

+0

Я добавил больше на этот ответ - со ссылками на более подробные сведения http://stackoverflow.com/a/19267917/150342 – Colin