using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.ChangeTracking; using Microsoft.EntityFrameworkCore.ValueGeneration; using Modules.User.Database.Database.Entities; namespace Modules.User.Database.Database; public class UserDbContext : DbContext { public DbSet Accounts { get; set; } public DbSet Users { get; set; } public DbSet Sessions { get; set; } public UserDbContext(DbContextOptions options) : base(options) { } protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder) { configurationBuilder.Properties().HaveConversion(); } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity(q => { q.HasOne(q => q.Account).WithOne(q => q.User).HasForeignKey(q => q.UserId); q.OwnsOne(q => q.RegionalSettings); q.Property(q => q.NickName).HasMaxLength(32); q.Property(q => q.FirstName).HasMaxLength(32); q.Property(q => q.LastName).HasMaxLength(128); q.Property(q => q.Patronymic).HasMaxLength(64); }); modelBuilder.Entity(q => { q.Property(q => q.Email).HasMaxLength(128); q.HasMany(q => q.Sessions).WithOne().HasForeignKey(q => q.AccountId); q.Property(q => q.CreationDate).HasDefaultValueSql("now()").ValueGeneratedOnAdd().HasValueGenerator(typeof(DatetimeNowValueGenerator)); }); modelBuilder.Entity(q => { //q.Property(q => q.DeviceInfo).HasMaxLength(128); //q.Property(q => q.UserAgent).HasMaxLength(128); q.OwnsOne(q => q.ClientInfo, q => { q.Property(q => q.UserAgent).HasMaxLength(256); q.Property(q => q.Country).HasMaxLength(96); q.Property(q => q.Region).HasMaxLength(128); }); q.Property(q => q.RefreshToken).HasMaxLength(172); //128 bytes to base64 q.Property(q => q.ExpiredDate).HasDefaultValueSql("'0001-01-01 00:00:00+00'").ValueGeneratedOnAdd(); q.Property(q => q.LastUpdate).HasDefaultValueSql("now()").ValueGeneratedOnAddOrUpdate(); //q.Property(q => q.LastUpdate).HasDefaultValueSql("now()").ValueGeneratedOnAddOrUpdate().HasValueGenerator(typeof(DatetimeNowValueGenerator)); }); } private class DatetimeNowValueGenerator : ValueGenerator { public override bool GeneratesTemporaryValues => false; public override DateTime Next(EntityEntry entry) { return DateTime.UtcNow; } } }