2014-12-19 5 views
2

Я собираюсь создать начальную таблицу в своем приложении, чтобы хранить все города/штаты моей страны. Это относительный большой набор данных: 5k + реестры.C# - Entity Framework - большой исходный код данных сначала

Чтение this post просветил для меня хороший способ сделать это, хотя я думаю, что оставление файла sql, который будет импортироваться EF, в открытом виде является недостатком безопасности.

Формат файла не имеет значения: я могу сделать его XLS или TXT, если захочу; вместо того, чтобы выполнять его как команду SQL в качестве показа в сообщении, я могу просто прочитать ее как поток и сгенерировать объекты, как показано в учебнике следующего hiperlink.

Чтение this tutorial о семенах данных в коде-первых, я увидел, что метод семян будет выполняться в процессе инициализациибазы данных и объекты семенные генерируются в методе семян.

Мои вопросы: О методах семян, что является лучшим подходом, подход SQL-файла или подход к объекту? Я лично считаю, что объектный подход более безопасен, но может быть медленнее, что может порождать мой второй вопрос: Метод семени, который выполняется в процессе инициализации базы данных, выполняется ТОЛЬКО при создании БД? Это немного непонятно для меня.

Спасибо.

+0

Метод 'Seed' выполняется, когда ваш db создан или когда вы выполняете миграцию db, и может быть очень медленным, если у вас есть 5k объектов для добавления. Я бы проголосовал за sql-файл, поскольку он будет намного быстрее с точки зрения исполнения. Когда я столкнулся с добавлением больших наборов объектов с EF, мне пришлось внести изменения в db после добавления ~ 100 объектов, чтобы добавить следующие объекты не потребуется много времени (хотя это было с EF 4) –

+0

Вы не укажите, какую базу данных вы используете. Но если вы используете Sql Server, вам следует использовать Bulk Copy или bcp.exe для загрузки вашей базы данных. Это самый быстрый способ загрузки базы данных. –

ответ

3
  1. Ссылка System.Data в проекте базы данных и добавить пакет NuGet EntityFramework.BulkInsert.

  2. Введите свои данные в методе семян, если вы обнаружили, что это не там:

    protected override void Seed(BulkEntities context) 
    { 
        if (!context.BulkItems.Any()) 
        { 
         var items = Enumerable.Range(0, 100000) 
            .Select(s => new BulkItem 
            { 
             Name = s.ToString(), 
             Status = "asdf" 
            }); 
    
         context.BulkInsert(items, 1000);     
        } 
    } 
    

Вставка 100000 элементов занимает около 3 секунд здесь.

Смежные вопросы