ventajas tutorial mvc framework first español ejemplo desventajas datos crear code agregar c# entity-framework sqlite .net-core

c# - tutorial - crear automáticamente una base de datos en Entity Framework Core



entity framework ventajas y desventajas (5)

Mi aplicación que se está portando a .NET core utilizará el nuevo EF Core con SQLite. Quiero crear automáticamente la base de datos y las estructuras de la tabla cuando la aplicación se ejecuta por primera vez. De acuerdo con la documentación básica de EF, esto se realiza mediante comandos manuales

dotnet ef migrations add MyFirstMigration dotnet ef database update

Sin embargo, no quiero que el usuario final ingrese estos comandos y preferiría que la aplicación creara y configurara la base de datos para el primer uso. Para EF 6 hay funcionalidades como

Database.SetInitializer(new CreateDatabaseIfNotExists<MyContext>());

Pero en EF Core estos no parecen existir. No puedo encontrar ningún ejemplo o documentación sobre algo equivalente para EF core y no se menciona en la lista de características que faltan en la documentación de EF core. Ya tengo la configuración de clases de modelo para poder escribir un código para inicializar la base de datos basada en los modelos, pero sería mucho más fácil si el marco lo hiciera automáticamente. No quiero crear automáticamente el modelo o migrar, solo crear las estructuras de la tabla en una nueva base de datos.

¿Me falta algo aquí o falta la función de creación automática de tablas en EF core?


Mi respuesta es muy similar a la respuesta de Ricardo, pero siento que mi enfoque es un poco más sencillo, simplemente porque está sucediendo mucho en su función de using que ni siquiera estoy seguro de cómo funciona exactamente en un nivel inferior.

Entonces, para aquellos que desean una solución simple y limpia que cree una base de datos para usted donde sepa exactamente lo que sucede debajo del capó, esto es para usted:

public Startup(IHostingEnvironment env) { using (var client = new TargetsContext()) { client.Database.EnsureCreated(); } }

Esto significa que dentro del DbContext que creó (en este caso, el mío se llama TargetsContext ), puede usar una instancia de DbContext para asegurarse de que las tablas definidas en la clase se crean cuando Startup.cs se ejecuta en su solicitud.


Para EF Core 2.0+ tuve que adoptar un enfoque diferente porque cambiaron la API. A partir de marzo de 2019, Microsoft recomienda que coloque el código de migración de la base de datos en la clase de entrada de la aplicación, pero fuera del código de compilación de WebHost.

public class Program { public static void Main(string[] args) { var host = CreateWebHostBuilder(args).Build(); using (var serviceScope = host.Services.CreateScope()) { var context = serviceScope.ServiceProvider.GetRequiredService<PersonContext>(); context.Database.Migrate(); } host.Run(); } public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>(); }


Si ha creado las migraciones, puede ejecutarlas en Startup.cs de la siguiente manera.

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope()) { var context = serviceScope.ServiceProvider.GetRequiredService<ApplicationDbContext>(); context.Database.Migrate(); } ...

Esto creará la base de datos y las tablas usando sus migraciones agregadas.

Si no usa Migraciones de Entity Framework, y en su lugar solo necesita que su modelo DbContext se cree exactamente como está en su clase de contexto en la primera ejecución, entonces puede usar:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope()) { var context = serviceScope.ServiceProvider.GetRequiredService<ApplicationDbContext>(); context.Database.EnsureCreated(); } ...

En lugar.

Si necesita eliminar su base de datos antes de asegurarse de que esté creada, llame a:

context.Database.EnsureDeleted();

Justo antes de llamar a CalculateCreated ()

Adaptado de: http://docs.identityserver.io/en/latest/quickstarts/7_entity_framework.html?highlight=entity


Si no ha creado migraciones, hay 2 opciones

1.crear la base de datos y las tablas desde la aplicación Principal:

var context = services.GetRequiredService<YourRepository>(); context.Database.EnsureCreated();

2.Cree las tablas si la base de datos ya existe:

var context = services.GetRequiredService<YourRepository>(); context.Database.EnsureCreated(); RelationalDatabaseCreator databaseCreator = (RelationalDatabaseCreator)context.Database.GetService<IDatabaseCreator>(); databaseCreator.CreateTables();

Gracias a la answer de Bubi


Si obtiene el contexto a través de la lista de parámetros de Configurar en Startup.cs, puede hacer esto:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, LoggerFactory loggerFactory, ApplicationDbContext context) { context.Database.Migrate(); ...