DatabaseContext.cs 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. using Microsoft.EntityFrameworkCore;
  2. using Microsoft.Extensions.DependencyInjection;
  3. namespace Benchmarks.Model;
  4. public sealed class DatabaseContext : DbContext
  5. {
  6. private static readonly Lazy<DbContextOptions<DatabaseContext>> TrackingOptions = new(() => CreateOptions(true), LazyThreadSafetyMode.ExecutionAndPublication);
  7. private static readonly Lazy<DbContextOptions<DatabaseContext>> NoTrackingOptions = new(() => CreateOptions(false), LazyThreadSafetyMode.ExecutionAndPublication);
  8. public static DatabaseContext CreateTracking() => new(TrackingOptions.Value, true);
  9. public static DatabaseContext CreateNoTracking() => new(NoTrackingOptions.Value, false);
  10. private static DbContextOptions<DatabaseContext> CreateOptions(bool tracking)
  11. {
  12. var services = new ServiceCollection();
  13. services.AddEntityFrameworkNpgsql();
  14. var provider = services.BuildServiceProvider();
  15. var builder = new DbContextOptionsBuilder<DatabaseContext>();
  16. builder.UseInternalServiceProvider(provider)
  17. .UseNpgsql("Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;SSL Mode=Disable;Maximum Pool Size=512;NoResetOnClose=true;Enlist=false;Max Auto Prepare=4;Multiplexing=true")
  18. .EnableThreadSafetyChecks(false)
  19. .UseModel(DatabaseContextModel.Instance);
  20. if (!tracking)
  21. {
  22. builder.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking);
  23. }
  24. return builder.Options;
  25. }
  26. internal DatabaseContext(DbContextOptions<DatabaseContext> options, bool tracking = false) : base(options)
  27. {
  28. ChangeTracker.AutoDetectChangesEnabled = tracking;
  29. }
  30. public DbSet<World> World { get; set; }
  31. public DbSet<Fortune> Fortune { get; set; }
  32. }