using Lactose.Models; namespace Lactose.Context; /// /// Entity Framework Core database context for the Lactose application. /// public class LactoseDbContext : DbContext { /// /// Gets or sets the assets DbSet. /// public DbSet Assets { get; set; } /// /// Gets or sets the albums DbSet. /// public DbSet Albums { get; set; } /// /// Gets or sets the faces DbSet. /// public DbSet Faces { get; set; } /// /// Gets or sets the people DbSet. /// public DbSet People { get; set; } /// /// Gets or sets the users DbSet. /// public DbSet Users { get; set; } /// /// Gets or sets the tags DbSet. /// public DbSet Tags { get; set; } /// /// Gets or sets the folders DbSet. /// public DbSet Folders { get; set; } /// /// Gets or sets the settings DbSet. /// public DbSet Settings { get; set; } /// /// Gets or sets the job records DbSet. /// public DbSet JobRecords { get; set; } /// /// Gets or sets the person-maintainer join table. /// public DbSet PersonMaintainers { get; set; } /// /// Initialises a new instance of the class. /// /// The database context options. public LactoseDbContext(DbContextOptions options) : base(options) {} /// protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder) { configurationBuilder.Properties() .HaveColumnType("timestamp with time zone"); configurationBuilder.Properties() .HaveColumnType("timestamp with time zone"); } /// protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.HasPostgresExtension("vector"); modelBuilder.HasPostgresExtension("pg_trgm"); //Album Relationships modelBuilder.Entity().HasOne(e => e.PersonOwner).WithMany(e => e.Albums); modelBuilder.Entity().HasOne(e => e.CoverAsset); modelBuilder.Entity().HasMany(e => e.Assets).WithMany(e => e.Albums); //Asset Relationships modelBuilder.Entity().HasOne(e => e.Uploader).WithMany(e => e.UploadedAssets).HasForeignKey(e => e.UploadedBy); modelBuilder.Entity().HasMany(e => e.Albums).WithMany(e => e.Assets); modelBuilder.Entity().HasMany(e => e.Tags).WithMany(e => e.Assets); modelBuilder.Entity().HasMany(e => e.Faces).WithOne(e => e.Asset); modelBuilder.Entity().HasOne(e => e.Folder).WithMany(e => e.Assets); modelBuilder.Entity().HasIndex(e => new { e.Visibility, e.UploadedBy }) .HasDatabaseName("IX_Assets_VisibleForSearch") .HasFilter("\"DeletedAt\" IS NULL"); modelBuilder.Entity().HasIndex(a => a.OriginalFilename) .HasDatabaseName("IX_Assets_OriginalFilename_Trgm") .HasMethod("gin") .HasOperators("gin_trgm_ops"); // People modelBuilder.Entity().HasIndex(p => p.Name) .HasDatabaseName("IX_People_Name_Trgm") .HasMethod("gin") .HasOperators("gin_trgm_ops"); // Albums modelBuilder.Entity().HasIndex(a => a.Title) .HasDatabaseName("IX_Albums_Title_Trgm") .HasMethod("gin") .HasOperators("gin_trgm_ops"); //Face Relationships modelBuilder.Entity().HasOne(e => e.Asset).WithMany(e => e.Faces); modelBuilder.Entity().HasOne(e => e.Person).WithMany(e => e.Faces); //Person Relationships modelBuilder.Entity().HasOne(e => e.ProfileAsset).WithMany().HasForeignKey(e => e.ProfileAssetId); modelBuilder.Entity().HasMany(e => e.Faces).WithOne(e => e.Person); modelBuilder.Entity().HasMany(e => e.Albums).WithOne(e => e.PersonOwner); modelBuilder.Entity().HasMany(e => e.Maintainers).WithMany(e => e.MaintainedPersons) .UsingEntity( j => j.HasOne(pm => pm.User).WithMany().HasForeignKey(pm => pm.UserId), j => j.HasOne(pm => pm.Person).WithMany().HasForeignKey(pm => pm.PersonId) ); //Tag Relationships modelBuilder.Entity().HasOne(e => e.Parent); modelBuilder.Entity().HasMany(e => e.Assets).WithMany(e => e.Tags); //User Relationships modelBuilder.Entity().HasMany(e => e.UploadedAssets).WithOne(e => e.Uploader).HasForeignKey(e => e.UploadedBy); //Folder Relationships modelBuilder.Entity().HasMany(e => e.Assets).WithOne(e => e.Folder); } }