Создание / обновление схемы базы данных из консольного приложения - PullRequest
0 голосов
/ 03 февраля 2020

У меня есть консольное приложение , которое взаимодействует с базой данных с помощью EF. Ядро. У меня есть DBContext, который выглядит следующим образом.

class HRDepartmentContext : DbContext
{
    public DbSet<Employee> Employee { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder options)
        => options.UseSqlite("Data Source=somepath\\employees.db");
}

Он используется в классе, который выглядит следующим образом.

class EmployeeManager
{
    public  CreateEmployee(string firstname, string lastname)
    {
        using (var db = new EmployeeContext())
        {
            db.Database.EnsureCreated();

            // logic for employee creation
        }
    }

    // other methods for delete/update the employees
    public UpdateEmployee(...) {...}
    public DeleteEmployee(...) {...}
}

Мои вопросы.

a) Что такое лучший способ вызова метода EnsureCreated , поскольку я не хочу вызывать его в отдельных методах Create / Update / Delete Employee.

б) Как лучше всего обрабатывать изменения схемы сценария ios в будущих версиях приложения? Читая документацию, она не выглядит так: EsureCreated сможет справиться со сценарием. Очевидно, что обновление схемы должно выполняться без потери существующих данных.

ОБНОВЛЕНИЕ: Я хочу избегать использования любых командных строк EF для миграции в случае изменений схемы. Я предпочитаю код для обработки.

Ответы [ 2 ]

1 голос
/ 03 февраля 2020

Лично в netcore 3 я бы использовал generi c IHost в вашем консольном приложении. Затем настройте службы базы данных, используя внедрение зависимостей. И IHostedService для создания или переноса базы данных во время запуска.

    public class Program {
        public static void ConfigureServices(HostBuilderContext context, IServiceCollection serviceCollection)
        {
            serviceCollection.AddEntityFrameworkSqlite();
            serviceCollection.AddHostedService<DatabaseStartup>();

            serviceCollection.AddDbContextPool<HRDepartmentContext>(o =>
            {
                o.UseSqlite("Data Source=somepath\\employees.db");
            });
            // configure other services here
        }

        public static async Task<int> Main(string[] args)
        {
            using (var host = CreateHostBuilder(args).Build())
            {
                await host.StartAsync();
                var lifetime = host.Services.GetRequiredService<IHostApplicationLifetime>();

                // insert other console app code here

                lifetime.StopApplication();
                await host.WaitForShutdownAsync();
            }
            return 0;
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host
                .CreateDefaultBuilder(args)
                .UseConsoleLifetime()
                .ConfigureServices(ConfigureServices);
    }

    public class DatabaseStartup : IHostedService {
        private readonly IServiceProvider serviceProvider;
        public DatabaseStartup(IServiceProvider serviceProvider){
            this.serviceProvider = serviceProvider;
        }

        public async Task StartAsync(CancellationToken cancellationToken)
        {
            using (var scope = serviceProvider.CreateScope())
            {
                var db = scope.ServiceProvider.GetRequiredService<HRDepartmentContext>();
                await db.Database.EnsureCreated();
                // or 
                await db.Database.MigrateAsync();
            }
        }

        public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask;
    }

Поскольку у вашего консольного приложения тогда есть CreateHostBuilder, инструменты командной строки каркаса сущности могут обнаружить любую пользовательскую конфигурацию при создании миграций.

0 голосов
/ 03 февраля 2020

Также для создания и employee можно использовать class constructor или object initializer

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...