using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.ChangeTracking; using System.Text.Json; namespace OpenArchival.DataAccess; public class ArchiveDbContext : DbContext { 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 ArtifactGroupingCategories { get; set; } public DbSet ArtifactDefects { get; set; } public DbSet ArtifactStorageLocations { get; set; } public DbSet ArtifactTypes { get; set; } public ArchiveDbContext(DbContextOptions options) : base(options) { } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity() .HasMany(p => p.RelatedArtifactGroupings) .WithMany() .UsingEntity(j => j.ToTable("RelatedGroupings")); modelBuilder.Entity() .HasMany(p => p.Files) .WithOne(p => p.ParentArtifactEntry) .HasForeignKey(p => p.ParentArtifactEntryId) .IsRequired(false); modelBuilder.Entity() .OwnsOne(p => p.IdentifierFields) .ToJson(); modelBuilder.Entity(builder => { builder.Property(p => p.FileTextContent) .HasConversion ( v => JsonSerializer.Serialize (v, new JsonSerializerOptions()), v => JsonSerializer.Deserialize> (v, new JsonSerializerOptions()) ?? new Dictionary() ); }); 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(builder => { builder.Property(p => p.FileTextContent) .HasConversion ( v => JsonSerializer.Serialize(v, new JsonSerializerOptions()), v => JsonSerializer.Deserialize>(v, new JsonSerializerOptions()) ?? new Dictionary() ).Metadata .SetValueComparer(dictionaryComparer); }); } }