Create new DbContext constructor with external Options.

And install related packages.
This commit is contained in:
Kevin Matsubara 2025-04-14 10:50:13 +02:00
parent ba77fbd176
commit 8fc6bc96c0
6 changed files with 70 additions and 16 deletions

View File

@ -10,4 +10,7 @@
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="9.0.3" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="../EntityFrameworkCore.Data/EntityFrameworkCore.Data.csproj" />
</ItemGroup>
</Project>

View File

@ -1,9 +1,31 @@
using EntityFrameworkCore.Data;
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
// Learn more about configuring OpenAPI at https://aka.ms/aspnet/openapi
builder.Services.AddOpenApi();
var sqliteDatabaseName = builder.Configuration.GetConnectionString("SqliteDatabaseName");
var folder = Environment.SpecialFolder.LocalApplicationData;
var path = Environment.GetFolderPath(folder);
var dbPath = Path.Combine(path, sqliteDatabaseName);
var connectionString = $"Data Source={dbPath}";
builder.Services.AddDbContext<DeadBallZoneLeagueDbContext>(options => {
options.UseSqlite(connectionString)
.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking)
.LogTo(Console.WriteLine, LogLevel.Information);
if (!builder.Environment.IsProduction())
{
// Do not allow this in Production.
options.EnableSensitiveDataLogging();
options.EnableDetailedErrors();
}
});
var app = builder.Build();
// Configure the HTTP request pipeline.

View File

@ -5,5 +5,8 @@
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
"AllowedHosts": "*",
"ConnectionStrings": {
"SqliteDatabaseName": "DeadBallZoneLeague_EFCore.db"
}
}

View File

@ -1,36 +1,26 @@
using Microsoft.EntityFrameworkCore;
using EntityFrameworkCore.Domain;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using System.Reflection;
using Microsoft.EntityFrameworkCore.Design;
namespace EntityFrameworkCore.Data;
public class DeadBallZoneLeagueDbContext : DbContext
{
private string DbPath;
public DeadBallZoneLeagueDbContext()
public DeadBallZoneLeagueDbContext(DbContextOptions<DeadBallZoneLeagueDbContext> options) : base(options)
{
// In Ubuntu 24.04, the file is created here: /home/user/.local/share
var folder = Environment.SpecialFolder.LocalApplicationData;
var path = Environment.GetFolderPath(folder);
DbPath = Path.Combine(path, "DeadBallZoneLeague_EFCore.db");
// This constuctor allows it to accept the options set from other instances, such as in the API project.
}
public DbSet<Team> Teams { get; set; }
public DbSet<Coach> Coaches { get; set; }
public DbSet<League> Leagues { get; set; }
public DbSet<Match> Matches { get; set; }
public DbSet<TeamsAndLeaguesView> TeamsAndLeaguesView { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlite($"Data source={DbPath}")
// .UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking) // Do not use tracking, set globally on all queries.
.LogTo(Console.WriteLine, LogLevel.Information)
.EnableSensitiveDataLogging() // Do not allow this in Production.
.EnableDetailedErrors(); // Do not allow this in Production.
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// modelBuilder.ApplyConfiguration(new TeamConfiguration());
@ -54,3 +44,24 @@ public class DeadBallZoneLeagueDbContext : DbContext
public DateTime GetEarliestTeamMatch(int teamId) => throw new NotImplementedException();
}
public class DeadBallZoneLeagueDbContextFactory : IDesignTimeDbContextFactory<DeadBallZoneLeagueDbContext>
{
public DeadBallZoneLeagueDbContext CreateDbContext(string[] args)
{
var folder = Environment.SpecialFolder.LocalApplicationData;
var path = Environment.GetFolderPath(folder);
IConfigurationRoot configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build();
var dbPath = Path.Combine(path, configuration.GetConnectionString("SqliteDatabaseName"));
var optionsBuilder = new DbContextOptionsBuilder<DeadBallZoneLeagueDbContext>();
optionsBuilder.UseSqlite($"Data Source={dbPath}");
return new DeadBallZoneLeagueDbContext(optionsBuilder.Options);
}
}

View File

@ -9,6 +9,9 @@
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.3" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="9.0.3" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="9.0.3" />
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="9.0.3" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="9.0.3" />
</ItemGroup>
<ItemGroup>

View File

@ -100,6 +100,18 @@ Note that the [Microsoft.EntityFrameworkCore.Tools](https://www.nuget.org/packag
* `dotnet add package Microsoft.EntityFrameworkCore.Sqlite --version 9.0.3`
[Microsoft.Extensions.Configuration](https://www.nuget.org/packages/Microsoft.Extensions.Configuration/9.0.3)
* `dotnet add package Microsoft.Extensions.Configuration --version 9.0.3`
[Microsoft.Extensions.Configuration.FileExtensions](https://www.nuget.org/packages/Microsoft.Extensions.Configuration.FileExtensions/9.0.3)
* `dotnet add package Microsoft.Extensions.Configuration.FileExtensions --version 9.0.3`
[Microsoft.Extensions.Configuration.Json](https://www.nuget.org/packages/Microsoft.Extensions.Configuration.Json/9.0.3)
* `dotnet add package Microsoft.Extensions.Configuration.Json --version 9.0.3`
## Tips for efficient querying
* Use indexes.