PccDbContext.cs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. using Microsoft.EntityFrameworkCore;
  2. using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
  3. using PCC.DbEntity;
  4. namespace PCC.IO;
  5. internal class PccDbContext : DbContext
  6. {
  7. private const string DbFileName = "PCC.DB3";
  8. public DbSet<ChatRecord> ChatRecords { get; set; } = null!;
  9. protected override void OnModelCreating(ModelBuilder modelBuilder)
  10. {
  11. base.OnModelCreating(modelBuilder);
  12. // 创建 ValueConverter:将 DateTimeOffset 转换为 UTC 的 yyyyMMddHHmmssfff 格式
  13. var dateTimeOffsetToBigIntConverter = new ValueConverter<DateTimeOffset, long>(
  14. v => long.Parse(v.UtcDateTime.ToString("yyyyMMddHHmmssfff")),
  15. v => DateTimeOffset.ParseExact(v.ToString(), "yyyyMMddHHmmssfff", null, System.Globalization.DateTimeStyles.AssumeUniversal)
  16. );
  17. var nullableDateTimeOffsetToBigIntConverter = new ValueConverter<DateTimeOffset?, long?>(
  18. v => v.HasValue ? long.Parse(v.Value.UtcDateTime.ToString("yyyyMMddHHmmssfff")) : (long?)null,
  19. v => v.HasValue ? DateTimeOffset.ParseExact(v.Value.ToString(), "yyyyMMddHHmmssfff", null, System.Globalization.DateTimeStyles.AssumeUniversal) : (DateTimeOffset?)null
  20. );
  21. // 应用于所有 DateTimeOffset 字段
  22. foreach (var entityType in modelBuilder.Model.GetEntityTypes())
  23. {
  24. foreach (var property in entityType.GetProperties())
  25. {
  26. if (property.ClrType == typeof(DateTimeOffset))
  27. {
  28. property.SetValueConverter(dateTimeOffsetToBigIntConverter);
  29. }
  30. else if (Nullable.GetUnderlyingType(property.ClrType) == typeof(DateTimeOffset))
  31. {
  32. property.SetValueConverter(nullableDateTimeOffsetToBigIntConverter);
  33. }
  34. }
  35. }
  36. }
  37. protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
  38. {
  39. optionsBuilder.UseSqlite($"Data Source={DbFileName}");
  40. }
  41. }