2016-05-20 2 views
3

У меня есть класс миграции:Entity Framework 7 - запуск семена в конце миграции

public partial class TestMigration : Migration 
{ 
    protected override void Up(MigrationBuilder db) 
    { 

В конце методы, я хотел бы добавить некоторые данные (семена). MigrationBuilder предоставляет некоторые методы, также Sql(), но я хотел бы использовать EF.

Могу ли я вставить DbContext здесь и сделать что-нибудь?

ответ

0

Невозможно изменить данные во время миграции. Текущее решение для баз данных посева - это делать это при запуске приложения, как показано в Unicode Store sample, что гарантирует, что все seed data is available.

Было проведено обсуждение этого вопроса в issue 3042, текущее усилие, похоже, заключается в изменении истории миграции, чтобы сделать возможным во время миграции to seed data. В настоящее время это запланировано после RTM, поэтому я бы сейчас не стал делать ставку на это.

+0

Это означает, что каждый раз, когда мы запускаем приложение, даже если никаких миграций не будет выполнено, мы создадим фиктивный «select from», чтобы увидеть, нужно ли добавлять данные. Я могу представить, что с простыми данными, но не с чем-то более сложным или с данными, которые пользователь может позже, например. delete ... – MadDeveloper

+0

Ну, это будет работать, когда приложение будет запущено да, в качестве начальной стоимости, которая не влияет на пользователей, посещающих ваши сайты. И все равно вы не будете запускать это на производственных серверах. Наличие автоматизированного процесса для обеспечения данных семян (вне задачи развертывания) довольно необычно. – poke

+0

У меня есть приложение WPF. – MadDeveloper

4

Я не рекомендую вам размещать базу данных в Миграции вверх или вниз. это плохая практика.

Вы можете выполнить заявление Sql в вашем вверх/вниз методе и семена таблицы следующим образом:

Ef6:

public override void Up() 
{ 
    Sql("INSERT INTO Customers (CustomerName, ContactName) VALUES ('Cardinal','Tom B.')"); 
    ... 
} 

EF Ядро 1,0/7:

protected override void Up(MigrationBuilder db) 
{ 
    db.Sql("INSERT INTO Customers (CustomerName, ContactName) VALUES ('Cardinal','Tom B.')"); 
} 

где Клиент является юридическим лицом DbSet < «Клиент»> Клиентами от вашего DbContext

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

1) Используйте обычный DBInitializer.Seed, чтобы засеять данные в базу данных.

2) Используйте инструкции Sql в ваших миграциях вверх/вниз для преобразования (обновления/удаления/вставки) данных и обеспечения совместимости данных между старой схемой базы данных и новой в ходе миграции.

3) Не пытайтесь создать DbContext wthing процесс миграции.

+1

Чтобы перемещать семена снаружи, сначала необходимо указать, какая миграция была выполнена ... – MadDeveloper

+4

Почему изменение данных во время миграции является плохой практикой? На самом деле я не вижу в этом причин. –

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