托管 Blazor WASM 中的 EFCore

EFCore in hosted Blazor WASM

我正在尝试在托管的 Blazor WASM 应用程序中使用 EFCore。

我的 Startup.cs 包含以下代码段:

        public void ConfigureServices(IServiceCollection services)
        {
            var databaseConfig = Configuration.GetSection("DATABASE").Get<DatabaseOptions>();
            var connectionString = databaseConfig.DbConnectionString;
            // services.AddDbContextFactory<PostgresContext>(opt => opt.UseNpgsql(connectionString));
            services.AddDbContext<PostgresContext>(opt => opt.UseNpgsql(connectionString));

            services.AddControllersWithViews();
            services.AddRazorPages();
        }

在我的 PostgresContext 中,我尝试执行以下操作:

        public PostgresContext(DbContextOptions<PostgresContext> options) : base(options)
        {
            // Database.EnsureDeleted();
            // Database.EnsureCreated();
        }

这不起作用,并且没有创建数据库。 然而;当我在 Controller 中使用 EnsureCreated()/EnsureDeleted() 时,它工作正常。虽然这是一个我不满意的解决方案,因为我认为不应该从控制器调用这些函数。

        private readonly IWebHostEnvironment _env;
        private readonly PostgresContext _context;

        public MobileController(PostgresContext context, IWebHostEnvironment env)
        {
            _context = context;
            _env = env;
        }

....

public async Task SomeFunction {
            await _context.Database.EnsureDeletedAsync();
            await _context.Database.EnsureCreatedAsync();
            
            await _context.AddRangeAsync(cranes);
            await _context.SaveChangesAsync();
}

初始化数据库的正确方法是什么(在开发中)?

生产的最佳做法是在运行时创建或迁移数据库。而不是在部署时这样做。要在 运行 时执行此操作,运行 EnsureCreated() / 在启动时迁移或创建一个仅管理数据库创建并在部署后调用它的控制器。