# EFCore Intergration ## Introduction This app relies on EF Core to access the database. However, it is NOT so smooth when work with NativeAOT. To use EF Core, see below. ## DesignTimeDbContextFactory To work with NativeAOT, a code-defined way to create DbContext instance is a MUST in nearly ALL operations of EF Core, letting ef tool discover the DbContext. In this project, `OptixServe.Infrastructure/Utilites/DesignTimeDbContextFactory.cs` is set up to do this. This class implements a simple commandline arguments parser, enabling passing arguments along with `dotnet ef`. Currently, there are two options, `--config/-c` and `--data-dir/-d` are supported. See documents there. To pass arguments/options to `CreateDbContext` static method, pass the arguments following with `dotnet ef` command, with two dashes splitting. For example: ```bash dotnet ef database update -- -c ../data/appsettings.Development.json -d ../data/ ``` ## Workflow To make the code work, following the steps: 1. Implement other parts 2. Compile the data models, with `--nativeaot` option. 3. Add migration 4. Update database 5. Build project, and Run! Here are the details. ### Requirements See [https://learn.microsoft.com/en-us/ef/core/performance/nativeaot-and-precompiled-queries]() ### Compile Models ```bash dotnet ef dbcontext optimize --output-dir Data/CompiledModels --precompile-queries --nativeaot -- -c ../data_dev/appsettings.Development.json -d ../data_dev/ ``` If this is the first time to run `dbcontext optimize`, DO NOT forget to `UseModel` in DbContext construction. ```cs OptixServe.Infrastructure/Utilites/DatabaseHelper.cs public static void ConfigureDbContext(DbContextOptionsBuilder options) { // ... options.UseSqlite(connectionString, b => b.MigrationsAssembly("OptixServe.Infrastructure")) .UseModel(AppDbContextModel.Instance); // ... } ``` ### Add Migration ```bash dotnet ef migrations add InitialCreate -- -c ../data_dev/appsettings.Development.json ``` ### Update Database ```bash dotnet ef database update -- -c ../data_dev/appsettings.Development.json -d ../data_dev/ ``` ### Build Project ```bash dotnet publish -c Release -r linux-x64 ```