Как и где вызывать Database.EnsureCreated и Database.Migrate?

У меня есть приложение ASP.NET MVC 6, и мне нужно вызвать методы Database.EnsureCreated и Database.Migrate.

Но куда мне их звать?

 John Pankowicz23 февр. 2018 г., 00:34
Вы можете не захотеть использовать либо. В документации MS говорится об использовании Migrate (): «Хотя это прекрасно для приложений с локальной базой данных, большинству приложений потребуется более надежная стратегия развертывания, например, создание сценариев SQL».docs.microsoft.com/en-us/ef/core/managing-schemas/migrations

Ответы на вопрос(4)

которую предоставили Джеймс П и Бассам Алугили, я закончил тем, что добавил эти строки кода в метод Startup.cs-> Configure.

 try
            {
                using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>()
                    .CreateScope())
                {

                    serviceScope.ServiceProvider.GetService<ApplicationDbContext>()
                        .Database.Migrate();
                }
            }
            catch (Exception e)
            {
                var msg = e.Message;
                var stacktrace = e.StackTrace;
            }
 nivs197806 июн. 2019 г., 11:02
Это именно то, что я искал. В большинстве примеров используется либо ядро ​​.Net, либо Web, и я был в приложении Windows Forms с .Net 4.6. База данных уже создана (поскольку пользователь в строке подключения не имеет прав на создание баз данных). И приведенный выше код создал все таблицы и все из миграций.

этот от Роуэн Миллер:

...EnsureCreated полностью обходит миграцию и просто создает схему для вас, вы не можете смешивать это с миграциями.EnsureCreated Предназначен для тестирования или быстрого прототипирования, когда вы можете каждый раз удалять и заново создавать базу данных. Если вы используете миграции и хотите, чтобы они автоматически применялись при запуске приложения, вы можете использоватьcontext.Database.Migrate() вместо.

Согласно ответуВот вам нужно добавитьGlobals.EnsureDatabaseCreated(); это кStartup.cs:

Функция запуска вStartup.cs:

public Startup(IHostingEnvironment env)
{
    // Set up configuration sources.
    var builder = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json")
            .AddEnvironmentVariables();

    if (env.IsDevelopment())
    {
        // This will push telemetry data through Application Insights pipeline faster, allowing you to view results immediately.
            builder.AddApplicationInsightsSettings(developerMode: true);
    }
    Configuration = builder.Build();
    Globals.Configuration = Configuration;
    Globals.HostingEnvironment = env;
    Globals.EnsureDatabaseCreated();
}

И определитьGlobals.EnsureDatabaseCreated() следующее:

public static void EnsureDatabaseCreated()
    {
        var optionsBuilder = new DbContextOptionsBuilder();
        if (HostingEnvironment.IsDevelopment()) optionsBuilder.UseSqlServer(Configuration["Data:dev:DataContext"]);
        else if (HostingEnvironment.IsStaging()) optionsBuilder.UseSqlServer(Configuration["Data:staging:DataContext"]);
        else if (HostingEnvironment.IsProduction()) optionsBuilder.UseSqlServer(Configuration["Data:live:DataContext"]);
        var context = new ApplicationContext(optionsBuilder.Options);
        context.Database.EnsureCreated();

        optionsBuilder = new DbContextOptionsBuilder();
        if (HostingEnvironment.IsDevelopment()) optionsBuilder.UseSqlServer(Configuration["Data:dev:TransientContext"]);
        else if (HostingEnvironment.IsStaging()) optionsBuilder.UseSqlServer(Configuration["Data:staging:TransientContext"]);
        else if (HostingEnvironment.IsProduction()) optionsBuilder.UseSqlServer(Configuration["Data:live:TransientContext"]);
        new TransientContext(optionsBuilder.Options).Database.EnsureCreated();
    }

Использоватьcontext.Database.Migrate() увидетьВот или жеВот.

 Douglas Gaskell29 дек. 2018 г., 04:53
То же самое, не видяGlobals, Это выглядит как нестандартный способ пытаться ломать это в
 Josh Sutterfield24 мая 2019 г., 08:53
Из того, что я понимаю, стандартным способом является то, что DbContext создается в Startup.ConfigureServices, но с помощью каких-то косвенных методов. Вы можете найти его там или в Startup.Configure с помощью app.ApplicationServices.GetRequiredService <T>. Я думаю.
 bailando bailando08 июл. 2016 г., 11:45
Здравствуйте, Джеймс, спасибо за ваш ответ! У меня нет доступа к изменяемому имени Globals в моем методе запуска, как я могу получить к нему доступ?

Что такое Database.EnsureCreated?

context.Database.EnsureCreated() это новый основной метод EF, который гарантирует, что база данных для контекста существует. Если он существует, никаких действий не предпринимается. Если он не существует, то создается база данных и вся ее схема, а также она обеспечивает совместимость с моделью для этого контекста.

Замечания: Этот метод не использует миграции для создания базы данных. Кроме того, созданная база данных не может быть позже обновлена ​​с помощью миграций. Если вы нацелены на реляционную базу данных и используете миграции, вы можете использоватьDbContext.Database.Migrate() метод, обеспечивающий создание базы данных и применение всех миграций.

Как мы это сделали с EF 6?

context.Database.EnsureCreated() эквивалентно перечисленным ниже подходам EF 6:

Консоль диспетчера пакетов:

Enable-Migrations -EnableAutomaticMigrations. Add-Migration / Update-Database.

Из кода:

Database.SetInitializer CreateDatabaseIfNotExists

или же

С помощью DbMigrationsConfiguration и установите AutomaticMigrationsEnabled = true;

Что такое Database.Migrate?

Применяет любые ожидающие миграции для контекста к базе данных. Создаст базу данных, если она еще не существует.

Как мы это сделали с EF 6?

context.Database.Migrate() эквивалентно перечисленным ниже подходам EF 6:

Консоль диспетчера пакетов:

Update-Database -TargetMigration

С пользовательской конфигурацией DbMigrationsConfiguration:

AutomaticMigrationsEnabled = false; или с DbMigrator.

Заключение:

Если вы используете миграции, естьcontext.Database.Migrate(), Если вы не хотите миграций и просто хотите быструю базу данных (обычно для тестирования), используйте context.Database.EnsureCreated () / EnsureDeleted ().

 Shimmy03 июл. 2019 г., 09:04
Где в точке входа приложения было бы хорошо позвонитьdbcontext.Migrate?
 Bassam Alugili08 июл. 2016 г., 11:58
и вот пример, как это назвать!stefanhendriks.com/2016/04/29/...
 Tom23 июл. 2019 г., 23:13
Есть лиcontext.Database.Migrate() выполнять каждую миграцию один за другим, если база данных не существует? Другие ORM, такие как Rails ActiveRecord, имеют команды, которые создают базу данных из текущей схемыrails db:setup вместоrails db:create && rails db:migrate. context.Database.EnsureCreated() кажется, работает таким образом, но вы говорите, что он предназначен для тестирования? Если пользователь устанавливает версию 5 моего приложения с нуля, он не должен проходить историю миграций, я думаю.
 Afshar Mohebbi16 сент. 2017 г., 15:18
Я думал чтоDatabase.Migrate() создает миграции (если необходимо), а затем обновляет основанную на нем базу. Просто похоже на автоматическую миграцию в EF 6. Но я ошибся. Он применяет только существующие миграции (если таковые имеются) к базе данных.
 bailando bailando08 июл. 2016 г., 11:48
Привет Бассам Алугили, спасибо за ответ! в моем проекте я использую миграции, я не знал, что нельзя использовать оба метода вместе.
 Ásgeir Gunnar Stefánsson06 дек. 2017 г., 16:07
Как я понимаю, Database.Migrate использует те же кредитные базы данных, которые используются приложением при выполнении операций вставки / запросов и т. Д. Против базы данных. Хотим ли мы, чтобы эти действия выполнял пользователь с привилегиями создания / отбрасывания? Есть ли способ позволить Database.Migrate () использовать другие кредитные средства (с привилегиями create / drop)?
 Shaswat Rungta22 янв. 2018 г., 07:45
Вы только что спасли меня от будущей катастрофы.почет

вы можете увидеть снижение производительности, если вы вызовете это в конструкторе вашего контекста ... После перемещенияEnsureCreated в утилите setup.cs я заметил значительное улучшение времени отклика.

Примечание: я использую EFC и UWP.

Ваш ответ на вопрос