asp.net-core - mvc - asp net core signalr tutorial
ASP-Core Migrate EF Core SQL DB en el inicio (6)
Basado en la respuesta de @steamrolla propondría la siguiente mejora:
public static class EnsureMigration
{
public static void EnsureMigrationOfContext<T>(this IApplicationBuilder app) where T:DbContext
{
var context = app.ApplicationServices.GetService<T>();
context.Database.Migrate();
}
}
Con esto también puede garantizar la migración de diferentes contextos, por ejemplo, si tiene una base de datos de Identidad.
Uso:
app.EnsureMigrationOfContext<context>();
¿Es posible que mi API web ASP Core se asegure de que la base de datos se migre a la última migración con EF Core? Sé que esto se puede hacer a través de la línea de comando, pero quiero hacerlo programáticamente.
Actualizar
Basado en la respuesta de Janshair Khan, se me ocurrió esta clase de ayuda:
using Microsoft.AspNetCore.Builder;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using MyWebApi.Models;
namespace MyWebApi
{
public static class DataSeeder
{
public static void SeedData(this IApplicationBuilder app)
{
var context = app.ApplicationServices.GetService<MyContext>();
if (!context.Database.EnsureCreated())
context.Database.Migrate();
}
}
}
Puede llamar a esto desde el método de Configure
en su Startup.cs
esta manera:
app.SeedData();
Basado en la respuesta de chintan310, aquí es cómo migro la base de datos. Esto asegura la separación de tareas relacionadas con la base de datos en Program.cs
:
public static void Main(string[] args)
{
var host = BuildWebHost(args);
using (var scope = host.Services.CreateScope())
{
var services = scope.ServiceProvider;
try
{
var context = services.GetService<AppDbContext>();
context.Database.Migrate();
var seeder = scope.ServiceProvider.GetService<AppSeeder>();
seeder.Seed().Wait();
}
catch (Exception ex)
{
var logger = services.GetRequiredService<ILogger<Program>>();
logger.LogError(ex, "An error occurred seeding the DB.");
}
}
host.Run();
}
private static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
Hice esto para migrar programáticamente con EF Core 2.1.2 y SQL Server, según las respuestas anteriores y la respuesta de bailando bailando en " ¿Cómo y dónde llamar a Database.EnsureCreated and Database.Migrate? ":
Startup.cs
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.EntityFrameworkCore;
namespace MyApp
{
public class Startup
{
// ... (only relevant code included) ...
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<MyAppContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("MyAppContext")));
// ...
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
using (var serviceScope = app.ApplicationServices.CreateScope())
{
var context = serviceScope.ServiceProvider.GetService<MyAppContext>();
context.Database.Migrate();
}
// ...
}
}
}
El proyecto que usa este código está disponible en Github .
Puedes usar
db.Database.EnsureCreated();
para obtener su db al día con su modelo actual. Si desea habilitar las migraciones (si se sospechan migraciones posteriores), utilice
db.Database.Migrate();
Y poner sus migraciones posteriores en el tiempo.
Una nota de la documentación sobre la llamada a db.Database.EnsureCreated()
:
Tenga en cuenta que esta API no utiliza migraciones para crear la base de datos. Además, la base de datos que se crea no puede actualizarse posteriormente utilizando migraciones. Si está apuntando a una base de datos relacional y está usando migraciones, puede usar el método DbContext.Database.Migrate () para asegurarse de que se crea la base de datos y se aplican todas las migraciones.
Es posible que desee llamar a db.Database.Migrate()
.
Comentario tomado de la fuente que se encuentra arriba de la declaración here .
Use el siguiente código para ejecutar la migración en
public async void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope())
{
var context = serviceScope.ServiceProvider.GetService<YourContext`enter code here`>();
context.Database.Migrate();
}
}