using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.ChangeTracking; using OpenArchival.DataAccess; using Microsoft.EntityFrameworkCore; namespace OpenArchival.DataAccess; public class ApplicationDbContext(DbContextOptions options) : IdentityDbContext(options) { public DbSet ArtifactGroupings { get; set; } public DbSet ArtifactEntries { get; set; } public DbSet ArtifactEntryTags { get; set; } public DbSet ArchiveCategories { get; set; } public DbSet ArtifactAssociatedNames { get; set; } public DbSet ArtifactFilePaths { get; set; } public DbSet ArtifactDefects { get; set; } public DbSet ArtifactStorageLocations { get; set; } public DbSet ArtifactTypes { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity() .HasMany(a => a.RelatedTo) .WithMany(a => a.RelatedBy) .UsingEntity(j => j.ToTable("ArtifactRelationships")); modelBuilder.Entity() .HasOne(a => a.StorageLocation) .WithMany(l => l.ArtifactEntries); modelBuilder.Entity() .OwnsOne(p => p.IdentifierFields) .ToJson(); modelBuilder.Entity() .HasMany(grouping => grouping.ChildArtifactEntries) .WithOne(entry => entry.ArtifactGrouping) .HasForeignKey(entry => entry.ArtifactGroupingId) .OnDelete(DeleteBehavior.Cascade); modelBuilder.Entity() .HasMany(entry => entry.Files) .WithOne(file => file.ParentArtifactEntry) .OnDelete(DeleteBehavior.Cascade); modelBuilder.Entity() .Navigation(g => g.IdentifierFields) .UsePropertyAccessMode(PropertyAccessMode.Field); var dictionaryComparer = new ValueComparer>( (dictionary1, dictionary2) => dictionary1.OrderBy(pair => pair.Key) .SequenceEqual(dictionary2.OrderBy(pair => pair.Key)), dictionary => dictionary.Aggregate( 0, (aggregatedHash, pair) => HashCode.Combine(aggregatedHash, pair.Key.GetHashCode(), pair.Value.GetHashCode())), sourceDictionary => new Dictionary(sourceDictionary) ); modelBuilder.Entity() .HasGeneratedTsVectorColumn( p => p.AllSearchVector, "english", p => p.AllSearchString ) .HasIndex(p => p.AllSearchVector) .HasMethod("GIN"); modelBuilder.Entity() .HasGeneratedTsVectorColumn( p => p.TagsSearchVector, "english", p => p.TagsSearchString ) .HasIndex(p => p.TagsSearchVector) .HasMethod("GIN"); modelBuilder.Entity() .HasGeneratedTsVectorColumn( p => p.DefectsSearchVector, "english", p => p.DefectsSearchString ) .HasIndex(p => p.DefectsSearchVector) .HasMethod("GIN"); modelBuilder.Entity() .HasGeneratedTsVectorColumn( p => p.ListedNamesSearchVector, "english", p => p.ListedNamesSearchString ) .HasIndex(p => p.ListedNamesSearchVector) .HasMethod("GIN"); modelBuilder.Entity() .HasGeneratedTsVectorColumn( p => p.TitleSearchVector, "english", p => p.TitleSearchString ) .HasIndex(p => p.TitleSearchVector) .HasMethod("GIN"); modelBuilder.Entity() .HasGeneratedTsVectorColumn( p => p.DescriptionSearchVector, "english", p => p.DescriptionSearchString ) .HasIndex(p => p.DescriptionSearchVector) .HasMethod("GIN"); modelBuilder.Entity() .HasGeneratedTsVectorColumn( p => p.FilenamesSearchVector, "english", p => p.FilenamesSearchString ) .HasIndex(p => p.FilenamesSearchVector) .HasMethod("GIN"); modelBuilder.Entity() .HasGeneratedTsVectorColumn( p => p.FileContentSearchVector, "english", p => p.FileContentSearchString ) .HasIndex(p => p.FileContentSearchVector) .HasMethod("GIN"); } }