Лучший способ постепенного начала данных в рамках сущности 4.3

StackOverflow https://stackoverflow.com/questions/9342459

Вопрос

Я использовал Entity Framework 4.3 в существующей базе данных, и у меня есть пара сценариев, которые я пытаюсь удовлетворить.

Во -первых, если я удалю свою базу данных, я бы хотел, чтобы EF воссоздал, если с нуля - я успешно использовал для этого инициализатор базы данных CreatedAtaBaseIfnotexists.

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

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

В некоторых примерах миграции EF я видел, как люди используют функцию SQL () в методе UP миграции для создания семян Как мне кажется странным, что вы будете использовать Pure SQL, когда вся идея EF абстрагирует это. Я пытался использовать контекст в методе UP, но по какой -то причине он не думал, что таблица, созданная в миграции, существовала, когда я пытался добавить данные семян непосредственно под вызовом для создания таблицы.

Любая мудрость очень ценится.

Это было полезно?

Решение

Если вы хотите использовать объекты для семян Seed Метод в вашей конфигурации миграций. Если вы генерируете свежий проект Enable-Migrations Вы получите этот класс конфигурации:

internal sealed class Configuration : DbMigrationsConfiguration<YourContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = false;
    }

    protected override void Seed(CFMigrationsWithNoMagic.BlogContext context)
    {
        //  This method will be called after migrating to the latest version.

        //  You can use the DbSet<T>.AddOrUpdate() helper extension method 
        //  to avoid creating duplicate seed data. E.g.
        //
        //    context.People.AddOrUpdate(
        //      p => p.FullName,
        //      new Person { FullName = "Andrew Peters" },
        //      new Person { FullName = "Brice Lambson" },
        //      new Person { FullName = "Rowan Miller" }
        //    );
        //
    }
}

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

Если вам нужен эффективный способ для посева, потому что вы должны семянными данными, вы получите лучший результат с общим:

public partial class SomeMigration : DbMigration
{
    public override void Up()
    {
        ...
        Sql("UPDATE ...");
        Sql("INSERT ...");
    }

    public override void Down()
    {
        ...
    }
}

Другие советы

Я бы не рекомендовал использовать Sql() звонит в вашем Up() Метод, потому что (IMO) это действительно предназначено для фактического кода миграции, для которого нет встроенной функции, а не кода семян.

Мне нравится думать о данных семян как о чем -то, что может измениться в будущем (даже если моя схема не сделает), поэтому я просто пишу «оборонительные» проверяет все мои вставки в функции семян, чтобы убедиться, что операция не стреляла ранее.

Рассмотрим сценарий, в котором у вас есть таблица «типов», которая начинается с 3 записей, но затем вы позже добавите 4 -е. Вам не нужно «миграция» для решения этого.

С использованием Seed() также дает вам полный контекст для работы, который намного приятнее, чем использование простых строк SQL в Sql() Метод, который Ледислав продемонстрировал.

Кроме того, имейте в виду, что преимущество использования встроенных методов EF для кода миграции и кода семян заключается в том, что ваши операции базы данных остаются нейтральными на платформе. Это означает, что ваши схемы изменения и запросы могут работать на Oracle, Postgre и т. Д. Если вы пишете настоящий сырой SQL, то вы потенциально запираете себя без необходимости.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top