Add: NativeAOT support with EF Core. However failed for compiled binary throw Exception in queries. Wait for a stable support for NativeAOT. Add: document for intergration EF Core with NativeAOT.
82 lines
2.2 KiB
Markdown
82 lines
2.2 KiB
Markdown
# 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
|
|
``` |