using Microsoft.EntityFrameworkCore; using EntityFrameworkCore.Domain; using Microsoft.Extensions.Logging; using System.Reflection; namespace EntityFrameworkCore.Data; public class DeadBallZoneLeagueDbContext : DbContext { private string DbPath; public DeadBallZoneLeagueDbContext() { // 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"); } public DbSet Teams { get; set; } public DbSet Coaches { get; set; } public DbSet Leagues { get; set; } public DbSet Matches { get; set; } public DbSet 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()); // modelBuilder.ApplyConfiguration(new LeagueConfiguration()); // This line can be used, then individual configurations do not need to be loaded. modelBuilder.ApplyConfigurationsFromAssembly(Assembly.GetExecutingAssembly()); // This database object does not have a Primary Key, so we state that here, otherwise an exception is thrown. modelBuilder.Entity().HasNoKey().ToView("vw_TeamsAndLeagues"); // This is for user-defined functions. modelBuilder.HasDbFunction( typeof(DeadBallZoneLeagueDbContext) .GetMethod( nameof(GetEarliestTeamMatch), new[] {typeof(int)} )) .HasName("GetEarliestMatch"); } public DateTime GetEarliestTeamMatch(int teamId) => throw new NotImplementedException(); }