Extracted some pages to their own assembly and finished the artifact display page code

This commit is contained in:
Vincent Allen
2025-10-08 13:08:12 -04:00
parent fd0e6290fe
commit 02c2660b09
626 changed files with 39989 additions and 1553 deletions

View File

@@ -57,6 +57,11 @@ public class ApplicationDbContext(DbContextOptions<ApplicationDbContext> options
.HasForeignKey(entry => entry.ArtifactGroupingId)
.OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity<ArtifactEntry>()
.HasMany(entry => entry.Files)
.WithOne(file => file.ParentArtifactEntry)
.OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity<ArtifactGrouping>()
.Navigation(g => g.IdentifierFields)
.UsePropertyAccessMode(PropertyAccessMode.Field);

View File

@@ -0,0 +1,725 @@
// <auto-generated />
using System;
using System.Collections.Generic;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
using OpenArchival.DataAccess;
#nullable disable
namespace OpenArchival.DataAccess.Migrations
{
[DbContext(typeof(ApplicationDbContext))]
[Migration("20250909181057_updated")]
partial class updated
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "9.0.8")
.HasAnnotation("Relational:MaxIdentifierLength", 63);
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
modelBuilder.Entity("ArtifactDefectArtifactEntry", b =>
{
b.Property<int>("ArtifactEntriesId")
.HasColumnType("integer");
b.Property<int>("DefectsId")
.HasColumnType("integer");
b.HasKey("ArtifactEntriesId", "DefectsId");
b.HasIndex("DefectsId");
b.ToTable("ArtifactDefectArtifactEntry");
});
modelBuilder.Entity("ArtifactEntryArtifactEntry", b =>
{
b.Property<int>("RelatedById")
.HasColumnType("integer");
b.Property<int>("RelatedToId")
.HasColumnType("integer");
b.HasKey("RelatedById", "RelatedToId");
b.HasIndex("RelatedToId");
b.ToTable("ArtifactRelationships", (string)null);
});
modelBuilder.Entity("ArtifactEntryArtifactEntryTag", b =>
{
b.Property<int>("ArtifactEntriesId")
.HasColumnType("integer");
b.Property<int>("TagsId")
.HasColumnType("integer");
b.HasKey("ArtifactEntriesId", "TagsId");
b.HasIndex("TagsId");
b.ToTable("ArtifactEntryArtifactEntryTag");
});
modelBuilder.Entity("ArtifactEntryListedName", b =>
{
b.Property<int>("ArtifactEntriesId")
.HasColumnType("integer");
b.Property<int>("ListedNamesId")
.HasColumnType("integer");
b.HasKey("ArtifactEntriesId", "ListedNamesId");
b.HasIndex("ListedNamesId");
b.ToTable("ArtifactEntryListedName");
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b =>
{
b.Property<string>("Id")
.HasColumnType("text");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasColumnType("text");
b.Property<string>("Name")
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.Property<string>("NormalizedName")
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.HasKey("Id");
b.HasIndex("NormalizedName")
.IsUnique()
.HasDatabaseName("RoleNameIndex");
b.ToTable("AspNetRoles", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("ClaimType")
.HasColumnType("text");
b.Property<string>("ClaimValue")
.HasColumnType("text");
b.Property<string>("RoleId")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.HasIndex("RoleId");
b.ToTable("AspNetRoleClaims", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("ClaimType")
.HasColumnType("text");
b.Property<string>("ClaimValue")
.HasColumnType("text");
b.Property<string>("UserId")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.HasIndex("UserId");
b.ToTable("AspNetUserClaims", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
{
b.Property<string>("LoginProvider")
.HasColumnType("text");
b.Property<string>("ProviderKey")
.HasColumnType("text");
b.Property<string>("ProviderDisplayName")
.HasColumnType("text");
b.Property<string>("UserId")
.IsRequired()
.HasColumnType("text");
b.HasKey("LoginProvider", "ProviderKey");
b.HasIndex("UserId");
b.ToTable("AspNetUserLogins", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b =>
{
b.Property<string>("UserId")
.HasColumnType("text");
b.Property<string>("RoleId")
.HasColumnType("text");
b.HasKey("UserId", "RoleId");
b.HasIndex("RoleId");
b.ToTable("AspNetUserRoles", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b =>
{
b.Property<string>("UserId")
.HasColumnType("text");
b.Property<string>("LoginProvider")
.HasColumnType("text");
b.Property<string>("Name")
.HasColumnType("text");
b.Property<string>("Value")
.HasColumnType("text");
b.HasKey("UserId", "LoginProvider", "Name");
b.ToTable("AspNetUserTokens", (string)null);
});
modelBuilder.Entity("OpenArchival.DataAccess.ApplicationUser", b =>
{
b.Property<string>("Id")
.HasColumnType("text");
b.Property<int>("AccessFailedCount")
.HasColumnType("integer");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasColumnType("text");
b.Property<string>("Email")
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.Property<bool>("EmailConfirmed")
.HasColumnType("boolean");
b.Property<bool>("LockoutEnabled")
.HasColumnType("boolean");
b.Property<DateTimeOffset?>("LockoutEnd")
.HasColumnType("timestamp with time zone");
b.Property<string>("NormalizedEmail")
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.Property<string>("NormalizedUserName")
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.Property<string>("PasswordHash")
.HasColumnType("text");
b.Property<string>("PermissionLevel")
.IsRequired()
.HasColumnType("text");
b.Property<string>("PhoneNumber")
.HasColumnType("text");
b.Property<bool>("PhoneNumberConfirmed")
.HasColumnType("boolean");
b.Property<string>("SecurityStamp")
.HasColumnType("text");
b.Property<bool>("TwoFactorEnabled")
.HasColumnType("boolean");
b.Property<string>("UserName")
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.HasKey("Id");
b.HasIndex("NormalizedEmail")
.HasDatabaseName("EmailIndex");
b.HasIndex("NormalizedUserName")
.IsUnique()
.HasDatabaseName("UserNameIndex");
b.ToTable("AspNetUsers", (string)null);
});
modelBuilder.Entity("OpenArchival.DataAccess.ArchiveCategory", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Description")
.HasColumnType("text");
b.PrimitiveCollection<List<string>>("FieldDescriptions")
.IsRequired()
.HasColumnType("text[]");
b.PrimitiveCollection<List<string>>("FieldNames")
.IsRequired()
.HasColumnType("text[]");
b.Property<string>("FieldSeparator")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.ToTable("ArchiveCategories");
});
modelBuilder.Entity("OpenArchival.DataAccess.ArtifactDefect", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Description")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.ToTable("ArtifactDefects");
});
modelBuilder.Entity("OpenArchival.DataAccess.ArtifactEntry", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<int>("ArtifactGroupingId")
.HasColumnType("integer");
b.Property<string>("ArtifactNumber")
.HasColumnType("text");
b.PrimitiveCollection<List<DateTime>>("AssociatedDates")
.HasColumnType("timestamp with time zone[]");
b.Property<string>("Description")
.HasColumnType("text");
b.Property<string>("FileTextContent")
.HasColumnType("text");
b.Property<bool>("IsPubliclyVisible")
.HasColumnType("boolean");
b.PrimitiveCollection<List<string>>("Links")
.HasColumnType("text[]");
b.Property<int>("StorageLocationId")
.HasColumnType("integer");
b.Property<string>("Title")
.IsRequired()
.HasColumnType("text");
b.Property<int>("TypeId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("ArtifactGroupingId");
b.HasIndex("StorageLocationId");
b.HasIndex("TypeId");
b.ToTable("ArtifactEntries");
});
modelBuilder.Entity("OpenArchival.DataAccess.ArtifactEntryTag", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.ToTable("ArtifactEntryTags");
});
modelBuilder.Entity("OpenArchival.DataAccess.ArtifactGrouping", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<int>("CategoryId")
.HasColumnType("integer");
b.Property<string>("Description")
.HasColumnType("text");
b.Property<bool>("IsPublicallyVisible")
.HasColumnType("boolean");
b.Property<string>("Title")
.IsRequired()
.HasColumnType("text");
b.Property<int>("TypeId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("CategoryId");
b.HasIndex("TypeId");
b.ToTable("ArtifactGroupings");
});
modelBuilder.Entity("OpenArchival.DataAccess.ArtifactStorageLocation", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Location")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.ToTable("ArtifactStorageLocations");
});
modelBuilder.Entity("OpenArchival.DataAccess.ArtifactType", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.ToTable("ArtifactTypes");
});
modelBuilder.Entity("OpenArchival.DataAccess.FilePathListing", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("OriginalName")
.IsRequired()
.HasColumnType("text");
b.Property<int?>("ParentArtifactEntryId")
.HasColumnType("integer");
b.Property<string>("Path")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.HasIndex("ParentArtifactEntryId");
b.ToTable("ArtifactFilePaths");
});
modelBuilder.Entity("OpenArchival.DataAccess.ListedName", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Value")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.ToTable("ArtifactAssociatedNames");
});
modelBuilder.Entity("ArtifactDefectArtifactEntry", b =>
{
b.HasOne("OpenArchival.DataAccess.ArtifactEntry", null)
.WithMany()
.HasForeignKey("ArtifactEntriesId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("OpenArchival.DataAccess.ArtifactDefect", null)
.WithMany()
.HasForeignKey("DefectsId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("ArtifactEntryArtifactEntry", b =>
{
b.HasOne("OpenArchival.DataAccess.ArtifactEntry", null)
.WithMany()
.HasForeignKey("RelatedById")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("OpenArchival.DataAccess.ArtifactEntry", null)
.WithMany()
.HasForeignKey("RelatedToId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("ArtifactEntryArtifactEntryTag", b =>
{
b.HasOne("OpenArchival.DataAccess.ArtifactEntry", null)
.WithMany()
.HasForeignKey("ArtifactEntriesId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("OpenArchival.DataAccess.ArtifactEntryTag", null)
.WithMany()
.HasForeignKey("TagsId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("ArtifactEntryListedName", b =>
{
b.HasOne("OpenArchival.DataAccess.ArtifactEntry", null)
.WithMany()
.HasForeignKey("ArtifactEntriesId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("OpenArchival.DataAccess.ListedName", null)
.WithMany()
.HasForeignKey("ListedNamesId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
{
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
.WithMany()
.HasForeignKey("RoleId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
{
b.HasOne("OpenArchival.DataAccess.ApplicationUser", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
{
b.HasOne("OpenArchival.DataAccess.ApplicationUser", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b =>
{
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
.WithMany()
.HasForeignKey("RoleId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("OpenArchival.DataAccess.ApplicationUser", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b =>
{
b.HasOne("OpenArchival.DataAccess.ApplicationUser", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("OpenArchival.DataAccess.ArtifactEntry", b =>
{
b.HasOne("OpenArchival.DataAccess.ArtifactGrouping", "ArtifactGrouping")
.WithMany("ChildArtifactEntries")
.HasForeignKey("ArtifactGroupingId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("OpenArchival.DataAccess.ArtifactStorageLocation", "StorageLocation")
.WithMany("ArtifactEntries")
.HasForeignKey("StorageLocationId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("OpenArchival.DataAccess.ArtifactType", "Type")
.WithMany("ArtifactEntries")
.HasForeignKey("TypeId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("ArtifactGrouping");
b.Navigation("StorageLocation");
b.Navigation("Type");
});
modelBuilder.Entity("OpenArchival.DataAccess.ArtifactGrouping", b =>
{
b.HasOne("OpenArchival.DataAccess.ArchiveCategory", "Category")
.WithMany()
.HasForeignKey("CategoryId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("OpenArchival.DataAccess.ArtifactType", "Type")
.WithMany()
.HasForeignKey("TypeId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.OwnsOne("OpenArchival.DataAccess.IdentifierFields", "IdentifierFields", b1 =>
{
b1.Property<int>("ArtifactGroupingId")
.HasColumnType("integer");
b1.PrimitiveCollection<List<string>>("Values")
.IsRequired()
.HasColumnType("text[]");
b1.HasKey("ArtifactGroupingId");
b1.ToTable("ArtifactGroupings");
b1.ToJson("IdentifierFields");
b1.WithOwner()
.HasForeignKey("ArtifactGroupingId");
});
b.Navigation("Category");
b.Navigation("IdentifierFields")
.IsRequired();
b.Navigation("Type");
});
modelBuilder.Entity("OpenArchival.DataAccess.FilePathListing", b =>
{
b.HasOne("OpenArchival.DataAccess.ArtifactEntry", "ParentArtifactEntry")
.WithMany("Files")
.HasForeignKey("ParentArtifactEntryId");
b.Navigation("ParentArtifactEntry");
});
modelBuilder.Entity("OpenArchival.DataAccess.ArtifactEntry", b =>
{
b.Navigation("Files");
});
modelBuilder.Entity("OpenArchival.DataAccess.ArtifactGrouping", b =>
{
b.Navigation("ChildArtifactEntries");
});
modelBuilder.Entity("OpenArchival.DataAccess.ArtifactStorageLocation", b =>
{
b.Navigation("ArtifactEntries");
});
modelBuilder.Entity("OpenArchival.DataAccess.ArtifactType", b =>
{
b.Navigation("ArtifactEntries");
});
#pragma warning restore 612, 618
}
}
}

View File

@@ -0,0 +1,22 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace OpenArchival.DataAccess.Migrations
{
/// <inheritdoc />
public partial class updated : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
}
}
}

View File

@@ -0,0 +1,726 @@
// <auto-generated />
using System;
using System.Collections.Generic;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
using OpenArchival.DataAccess;
#nullable disable
namespace OpenArchival.DataAccess.Migrations
{
[DbContext(typeof(ApplicationDbContext))]
[Migration("20250909183426_AddedCascadeToFilePaths")]
partial class AddedCascadeToFilePaths
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "9.0.8")
.HasAnnotation("Relational:MaxIdentifierLength", 63);
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
modelBuilder.Entity("ArtifactDefectArtifactEntry", b =>
{
b.Property<int>("ArtifactEntriesId")
.HasColumnType("integer");
b.Property<int>("DefectsId")
.HasColumnType("integer");
b.HasKey("ArtifactEntriesId", "DefectsId");
b.HasIndex("DefectsId");
b.ToTable("ArtifactDefectArtifactEntry");
});
modelBuilder.Entity("ArtifactEntryArtifactEntry", b =>
{
b.Property<int>("RelatedById")
.HasColumnType("integer");
b.Property<int>("RelatedToId")
.HasColumnType("integer");
b.HasKey("RelatedById", "RelatedToId");
b.HasIndex("RelatedToId");
b.ToTable("ArtifactRelationships", (string)null);
});
modelBuilder.Entity("ArtifactEntryArtifactEntryTag", b =>
{
b.Property<int>("ArtifactEntriesId")
.HasColumnType("integer");
b.Property<int>("TagsId")
.HasColumnType("integer");
b.HasKey("ArtifactEntriesId", "TagsId");
b.HasIndex("TagsId");
b.ToTable("ArtifactEntryArtifactEntryTag");
});
modelBuilder.Entity("ArtifactEntryListedName", b =>
{
b.Property<int>("ArtifactEntriesId")
.HasColumnType("integer");
b.Property<int>("ListedNamesId")
.HasColumnType("integer");
b.HasKey("ArtifactEntriesId", "ListedNamesId");
b.HasIndex("ListedNamesId");
b.ToTable("ArtifactEntryListedName");
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b =>
{
b.Property<string>("Id")
.HasColumnType("text");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasColumnType("text");
b.Property<string>("Name")
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.Property<string>("NormalizedName")
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.HasKey("Id");
b.HasIndex("NormalizedName")
.IsUnique()
.HasDatabaseName("RoleNameIndex");
b.ToTable("AspNetRoles", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("ClaimType")
.HasColumnType("text");
b.Property<string>("ClaimValue")
.HasColumnType("text");
b.Property<string>("RoleId")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.HasIndex("RoleId");
b.ToTable("AspNetRoleClaims", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("ClaimType")
.HasColumnType("text");
b.Property<string>("ClaimValue")
.HasColumnType("text");
b.Property<string>("UserId")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.HasIndex("UserId");
b.ToTable("AspNetUserClaims", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
{
b.Property<string>("LoginProvider")
.HasColumnType("text");
b.Property<string>("ProviderKey")
.HasColumnType("text");
b.Property<string>("ProviderDisplayName")
.HasColumnType("text");
b.Property<string>("UserId")
.IsRequired()
.HasColumnType("text");
b.HasKey("LoginProvider", "ProviderKey");
b.HasIndex("UserId");
b.ToTable("AspNetUserLogins", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b =>
{
b.Property<string>("UserId")
.HasColumnType("text");
b.Property<string>("RoleId")
.HasColumnType("text");
b.HasKey("UserId", "RoleId");
b.HasIndex("RoleId");
b.ToTable("AspNetUserRoles", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b =>
{
b.Property<string>("UserId")
.HasColumnType("text");
b.Property<string>("LoginProvider")
.HasColumnType("text");
b.Property<string>("Name")
.HasColumnType("text");
b.Property<string>("Value")
.HasColumnType("text");
b.HasKey("UserId", "LoginProvider", "Name");
b.ToTable("AspNetUserTokens", (string)null);
});
modelBuilder.Entity("OpenArchival.DataAccess.ApplicationUser", b =>
{
b.Property<string>("Id")
.HasColumnType("text");
b.Property<int>("AccessFailedCount")
.HasColumnType("integer");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasColumnType("text");
b.Property<string>("Email")
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.Property<bool>("EmailConfirmed")
.HasColumnType("boolean");
b.Property<bool>("LockoutEnabled")
.HasColumnType("boolean");
b.Property<DateTimeOffset?>("LockoutEnd")
.HasColumnType("timestamp with time zone");
b.Property<string>("NormalizedEmail")
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.Property<string>("NormalizedUserName")
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.Property<string>("PasswordHash")
.HasColumnType("text");
b.Property<string>("PermissionLevel")
.IsRequired()
.HasColumnType("text");
b.Property<string>("PhoneNumber")
.HasColumnType("text");
b.Property<bool>("PhoneNumberConfirmed")
.HasColumnType("boolean");
b.Property<string>("SecurityStamp")
.HasColumnType("text");
b.Property<bool>("TwoFactorEnabled")
.HasColumnType("boolean");
b.Property<string>("UserName")
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.HasKey("Id");
b.HasIndex("NormalizedEmail")
.HasDatabaseName("EmailIndex");
b.HasIndex("NormalizedUserName")
.IsUnique()
.HasDatabaseName("UserNameIndex");
b.ToTable("AspNetUsers", (string)null);
});
modelBuilder.Entity("OpenArchival.DataAccess.ArchiveCategory", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Description")
.HasColumnType("text");
b.PrimitiveCollection<List<string>>("FieldDescriptions")
.IsRequired()
.HasColumnType("text[]");
b.PrimitiveCollection<List<string>>("FieldNames")
.IsRequired()
.HasColumnType("text[]");
b.Property<string>("FieldSeparator")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.ToTable("ArchiveCategories");
});
modelBuilder.Entity("OpenArchival.DataAccess.ArtifactDefect", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Description")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.ToTable("ArtifactDefects");
});
modelBuilder.Entity("OpenArchival.DataAccess.ArtifactEntry", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<int>("ArtifactGroupingId")
.HasColumnType("integer");
b.Property<string>("ArtifactNumber")
.HasColumnType("text");
b.PrimitiveCollection<List<DateTime>>("AssociatedDates")
.HasColumnType("timestamp with time zone[]");
b.Property<string>("Description")
.HasColumnType("text");
b.Property<string>("FileTextContent")
.HasColumnType("text");
b.Property<bool>("IsPubliclyVisible")
.HasColumnType("boolean");
b.PrimitiveCollection<List<string>>("Links")
.HasColumnType("text[]");
b.Property<int>("StorageLocationId")
.HasColumnType("integer");
b.Property<string>("Title")
.IsRequired()
.HasColumnType("text");
b.Property<int>("TypeId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("ArtifactGroupingId");
b.HasIndex("StorageLocationId");
b.HasIndex("TypeId");
b.ToTable("ArtifactEntries");
});
modelBuilder.Entity("OpenArchival.DataAccess.ArtifactEntryTag", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.ToTable("ArtifactEntryTags");
});
modelBuilder.Entity("OpenArchival.DataAccess.ArtifactGrouping", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<int>("CategoryId")
.HasColumnType("integer");
b.Property<string>("Description")
.HasColumnType("text");
b.Property<bool>("IsPublicallyVisible")
.HasColumnType("boolean");
b.Property<string>("Title")
.IsRequired()
.HasColumnType("text");
b.Property<int>("TypeId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("CategoryId");
b.HasIndex("TypeId");
b.ToTable("ArtifactGroupings");
});
modelBuilder.Entity("OpenArchival.DataAccess.ArtifactStorageLocation", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Location")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.ToTable("ArtifactStorageLocations");
});
modelBuilder.Entity("OpenArchival.DataAccess.ArtifactType", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.ToTable("ArtifactTypes");
});
modelBuilder.Entity("OpenArchival.DataAccess.FilePathListing", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("OriginalName")
.IsRequired()
.HasColumnType("text");
b.Property<int?>("ParentArtifactEntryId")
.HasColumnType("integer");
b.Property<string>("Path")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.HasIndex("ParentArtifactEntryId");
b.ToTable("ArtifactFilePaths");
});
modelBuilder.Entity("OpenArchival.DataAccess.ListedName", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Value")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.ToTable("ArtifactAssociatedNames");
});
modelBuilder.Entity("ArtifactDefectArtifactEntry", b =>
{
b.HasOne("OpenArchival.DataAccess.ArtifactEntry", null)
.WithMany()
.HasForeignKey("ArtifactEntriesId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("OpenArchival.DataAccess.ArtifactDefect", null)
.WithMany()
.HasForeignKey("DefectsId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("ArtifactEntryArtifactEntry", b =>
{
b.HasOne("OpenArchival.DataAccess.ArtifactEntry", null)
.WithMany()
.HasForeignKey("RelatedById")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("OpenArchival.DataAccess.ArtifactEntry", null)
.WithMany()
.HasForeignKey("RelatedToId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("ArtifactEntryArtifactEntryTag", b =>
{
b.HasOne("OpenArchival.DataAccess.ArtifactEntry", null)
.WithMany()
.HasForeignKey("ArtifactEntriesId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("OpenArchival.DataAccess.ArtifactEntryTag", null)
.WithMany()
.HasForeignKey("TagsId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("ArtifactEntryListedName", b =>
{
b.HasOne("OpenArchival.DataAccess.ArtifactEntry", null)
.WithMany()
.HasForeignKey("ArtifactEntriesId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("OpenArchival.DataAccess.ListedName", null)
.WithMany()
.HasForeignKey("ListedNamesId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
{
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
.WithMany()
.HasForeignKey("RoleId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
{
b.HasOne("OpenArchival.DataAccess.ApplicationUser", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
{
b.HasOne("OpenArchival.DataAccess.ApplicationUser", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b =>
{
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
.WithMany()
.HasForeignKey("RoleId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("OpenArchival.DataAccess.ApplicationUser", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b =>
{
b.HasOne("OpenArchival.DataAccess.ApplicationUser", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("OpenArchival.DataAccess.ArtifactEntry", b =>
{
b.HasOne("OpenArchival.DataAccess.ArtifactGrouping", "ArtifactGrouping")
.WithMany("ChildArtifactEntries")
.HasForeignKey("ArtifactGroupingId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("OpenArchival.DataAccess.ArtifactStorageLocation", "StorageLocation")
.WithMany("ArtifactEntries")
.HasForeignKey("StorageLocationId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("OpenArchival.DataAccess.ArtifactType", "Type")
.WithMany("ArtifactEntries")
.HasForeignKey("TypeId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("ArtifactGrouping");
b.Navigation("StorageLocation");
b.Navigation("Type");
});
modelBuilder.Entity("OpenArchival.DataAccess.ArtifactGrouping", b =>
{
b.HasOne("OpenArchival.DataAccess.ArchiveCategory", "Category")
.WithMany()
.HasForeignKey("CategoryId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("OpenArchival.DataAccess.ArtifactType", "Type")
.WithMany()
.HasForeignKey("TypeId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.OwnsOne("OpenArchival.DataAccess.IdentifierFields", "IdentifierFields", b1 =>
{
b1.Property<int>("ArtifactGroupingId")
.HasColumnType("integer");
b1.PrimitiveCollection<List<string>>("Values")
.IsRequired()
.HasColumnType("text[]");
b1.HasKey("ArtifactGroupingId");
b1.ToTable("ArtifactGroupings");
b1.ToJson("IdentifierFields");
b1.WithOwner()
.HasForeignKey("ArtifactGroupingId");
});
b.Navigation("Category");
b.Navigation("IdentifierFields")
.IsRequired();
b.Navigation("Type");
});
modelBuilder.Entity("OpenArchival.DataAccess.FilePathListing", b =>
{
b.HasOne("OpenArchival.DataAccess.ArtifactEntry", "ParentArtifactEntry")
.WithMany("Files")
.HasForeignKey("ParentArtifactEntryId")
.OnDelete(DeleteBehavior.Cascade);
b.Navigation("ParentArtifactEntry");
});
modelBuilder.Entity("OpenArchival.DataAccess.ArtifactEntry", b =>
{
b.Navigation("Files");
});
modelBuilder.Entity("OpenArchival.DataAccess.ArtifactGrouping", b =>
{
b.Navigation("ChildArtifactEntries");
});
modelBuilder.Entity("OpenArchival.DataAccess.ArtifactStorageLocation", b =>
{
b.Navigation("ArtifactEntries");
});
modelBuilder.Entity("OpenArchival.DataAccess.ArtifactType", b =>
{
b.Navigation("ArtifactEntries");
});
#pragma warning restore 612, 618
}
}
}

View File

@@ -0,0 +1,41 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace OpenArchival.DataAccess.Migrations
{
/// <inheritdoc />
public partial class AddedCascadeToFilePaths : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_ArtifactFilePaths_ArtifactEntries_ParentArtifactEntryId",
table: "ArtifactFilePaths");
migrationBuilder.AddForeignKey(
name: "FK_ArtifactFilePaths_ArtifactEntries_ParentArtifactEntryId",
table: "ArtifactFilePaths",
column: "ParentArtifactEntryId",
principalTable: "ArtifactEntries",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_ArtifactFilePaths_ArtifactEntries_ParentArtifactEntryId",
table: "ArtifactFilePaths");
migrationBuilder.AddForeignKey(
name: "FK_ArtifactFilePaths_ArtifactEntries_ParentArtifactEntryId",
table: "ArtifactFilePaths",
column: "ParentArtifactEntryId",
principalTable: "ArtifactEntries",
principalColumn: "Id");
}
}
}

View File

@@ -0,0 +1,737 @@
// <auto-generated />
using System;
using System.Collections.Generic;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
using OpenArchival.DataAccess;
#nullable disable
namespace OpenArchival.DataAccess.Migrations
{
[DbContext(typeof(ApplicationDbContext))]
[Migration("20251007175100_AddedCSharpCalculatedProperty")]
partial class AddedCSharpCalculatedProperty
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "9.0.8")
.HasAnnotation("Relational:MaxIdentifierLength", 63);
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
modelBuilder.Entity("ArtifactDefectArtifactEntry", b =>
{
b.Property<int>("ArtifactEntriesId")
.HasColumnType("integer");
b.Property<int>("DefectsId")
.HasColumnType("integer");
b.HasKey("ArtifactEntriesId", "DefectsId");
b.HasIndex("DefectsId");
b.ToTable("ArtifactDefectArtifactEntry");
});
modelBuilder.Entity("ArtifactEntryArtifactEntry", b =>
{
b.Property<int>("RelatedById")
.HasColumnType("integer");
b.Property<int>("RelatedToId")
.HasColumnType("integer");
b.HasKey("RelatedById", "RelatedToId");
b.HasIndex("RelatedToId");
b.ToTable("ArtifactRelationships", (string)null);
});
modelBuilder.Entity("ArtifactEntryArtifactEntryTag", b =>
{
b.Property<int>("ArtifactEntriesId")
.HasColumnType("integer");
b.Property<int>("TagsId")
.HasColumnType("integer");
b.HasKey("ArtifactEntriesId", "TagsId");
b.HasIndex("TagsId");
b.ToTable("ArtifactEntryArtifactEntryTag");
});
modelBuilder.Entity("ArtifactEntryListedName", b =>
{
b.Property<int>("ArtifactEntriesId")
.HasColumnType("integer");
b.Property<int>("ListedNamesId")
.HasColumnType("integer");
b.HasKey("ArtifactEntriesId", "ListedNamesId");
b.HasIndex("ListedNamesId");
b.ToTable("ArtifactEntryListedName");
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b =>
{
b.Property<string>("Id")
.HasColumnType("text");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasColumnType("text");
b.Property<string>("Name")
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.Property<string>("NormalizedName")
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.HasKey("Id");
b.HasIndex("NormalizedName")
.IsUnique()
.HasDatabaseName("RoleNameIndex");
b.ToTable("AspNetRoles", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("ClaimType")
.HasColumnType("text");
b.Property<string>("ClaimValue")
.HasColumnType("text");
b.Property<string>("RoleId")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.HasIndex("RoleId");
b.ToTable("AspNetRoleClaims", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("ClaimType")
.HasColumnType("text");
b.Property<string>("ClaimValue")
.HasColumnType("text");
b.Property<string>("UserId")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.HasIndex("UserId");
b.ToTable("AspNetUserClaims", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
{
b.Property<string>("LoginProvider")
.HasColumnType("text");
b.Property<string>("ProviderKey")
.HasColumnType("text");
b.Property<string>("ProviderDisplayName")
.HasColumnType("text");
b.Property<string>("UserId")
.IsRequired()
.HasColumnType("text");
b.HasKey("LoginProvider", "ProviderKey");
b.HasIndex("UserId");
b.ToTable("AspNetUserLogins", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b =>
{
b.Property<string>("UserId")
.HasColumnType("text");
b.Property<string>("RoleId")
.HasColumnType("text");
b.HasKey("UserId", "RoleId");
b.HasIndex("RoleId");
b.ToTable("AspNetUserRoles", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b =>
{
b.Property<string>("UserId")
.HasColumnType("text");
b.Property<string>("LoginProvider")
.HasColumnType("text");
b.Property<string>("Name")
.HasColumnType("text");
b.Property<string>("Value")
.HasColumnType("text");
b.HasKey("UserId", "LoginProvider", "Name");
b.ToTable("AspNetUserTokens", (string)null);
});
modelBuilder.Entity("OpenArchival.DataAccess.ApplicationUser", b =>
{
b.Property<string>("Id")
.HasColumnType("text");
b.Property<int>("AccessFailedCount")
.HasColumnType("integer");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasColumnType("text");
b.Property<string>("Email")
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.Property<bool>("EmailConfirmed")
.HasColumnType("boolean");
b.Property<bool>("LockoutEnabled")
.HasColumnType("boolean");
b.Property<DateTimeOffset?>("LockoutEnd")
.HasColumnType("timestamp with time zone");
b.Property<string>("NormalizedEmail")
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.Property<string>("NormalizedUserName")
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.Property<string>("PasswordHash")
.HasColumnType("text");
b.Property<string>("PermissionLevel")
.IsRequired()
.HasColumnType("text");
b.Property<string>("PhoneNumber")
.HasColumnType("text");
b.Property<bool>("PhoneNumberConfirmed")
.HasColumnType("boolean");
b.Property<string>("SecurityStamp")
.HasColumnType("text");
b.Property<bool>("TwoFactorEnabled")
.HasColumnType("boolean");
b.Property<string>("UserName")
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.HasKey("Id");
b.HasIndex("NormalizedEmail")
.HasDatabaseName("EmailIndex");
b.HasIndex("NormalizedUserName")
.IsUnique()
.HasDatabaseName("UserNameIndex");
b.ToTable("AspNetUsers", (string)null);
});
modelBuilder.Entity("OpenArchival.DataAccess.ArchiveCategory", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Description")
.HasColumnType("text");
b.PrimitiveCollection<List<string>>("FieldDescriptions")
.IsRequired()
.HasColumnType("text[]");
b.PrimitiveCollection<List<string>>("FieldNames")
.IsRequired()
.HasColumnType("text[]");
b.Property<string>("FieldSeparator")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.ToTable("ArchiveCategories");
});
modelBuilder.Entity("OpenArchival.DataAccess.ArtifactDefect", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Description")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.ToTable("ArtifactDefects");
});
modelBuilder.Entity("OpenArchival.DataAccess.ArtifactEntry", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<int>("ArtifactGroupingId")
.HasColumnType("integer");
b.Property<string>("ArtifactNumber")
.HasColumnType("text");
b.PrimitiveCollection<List<DateTime>>("AssociatedDates")
.HasColumnType("timestamp with time zone[]");
b.Property<string>("Description")
.HasColumnType("text");
b.Property<string>("FileTextContent")
.HasColumnType("text");
b.Property<bool>("IsPubliclyVisible")
.HasColumnType("boolean");
b.PrimitiveCollection<List<string>>("Links")
.HasColumnType("text[]");
b.Property<int>("StorageLocationId")
.HasColumnType("integer");
b.Property<string>("Title")
.IsRequired()
.HasColumnType("text");
b.Property<int>("TypeId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("ArtifactGroupingId");
b.HasIndex("StorageLocationId");
b.HasIndex("TypeId");
b.ToTable("ArtifactEntries");
});
modelBuilder.Entity("OpenArchival.DataAccess.ArtifactEntryTag", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.ToTable("ArtifactEntryTags");
});
modelBuilder.Entity("OpenArchival.DataAccess.ArtifactGrouping", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<int>("CategoryId")
.HasColumnType("integer");
b.Property<string>("Description")
.HasColumnType("text");
b.Property<bool>("IsPublicallyVisible")
.HasColumnType("boolean");
b.Property<string>("Title")
.IsRequired()
.HasColumnType("text");
b.Property<int>("TypeId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("CategoryId");
b.HasIndex("TypeId");
b.ToTable("ArtifactGroupings");
});
modelBuilder.Entity("OpenArchival.DataAccess.ArtifactStorageLocation", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Location")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.ToTable("ArtifactStorageLocations");
});
modelBuilder.Entity("OpenArchival.DataAccess.ArtifactType", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.ToTable("ArtifactTypes");
});
modelBuilder.Entity("OpenArchival.DataAccess.FilePathListing", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<int?>("ArtifactGroupingId")
.HasColumnType("integer");
b.Property<string>("OriginalName")
.IsRequired()
.HasColumnType("text");
b.Property<int?>("ParentArtifactEntryId")
.HasColumnType("integer");
b.Property<string>("Path")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.HasIndex("ArtifactGroupingId");
b.HasIndex("ParentArtifactEntryId");
b.ToTable("ArtifactFilePaths");
});
modelBuilder.Entity("OpenArchival.DataAccess.ListedName", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Value")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.ToTable("ArtifactAssociatedNames");
});
modelBuilder.Entity("ArtifactDefectArtifactEntry", b =>
{
b.HasOne("OpenArchival.DataAccess.ArtifactEntry", null)
.WithMany()
.HasForeignKey("ArtifactEntriesId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("OpenArchival.DataAccess.ArtifactDefect", null)
.WithMany()
.HasForeignKey("DefectsId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("ArtifactEntryArtifactEntry", b =>
{
b.HasOne("OpenArchival.DataAccess.ArtifactEntry", null)
.WithMany()
.HasForeignKey("RelatedById")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("OpenArchival.DataAccess.ArtifactEntry", null)
.WithMany()
.HasForeignKey("RelatedToId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("ArtifactEntryArtifactEntryTag", b =>
{
b.HasOne("OpenArchival.DataAccess.ArtifactEntry", null)
.WithMany()
.HasForeignKey("ArtifactEntriesId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("OpenArchival.DataAccess.ArtifactEntryTag", null)
.WithMany()
.HasForeignKey("TagsId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("ArtifactEntryListedName", b =>
{
b.HasOne("OpenArchival.DataAccess.ArtifactEntry", null)
.WithMany()
.HasForeignKey("ArtifactEntriesId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("OpenArchival.DataAccess.ListedName", null)
.WithMany()
.HasForeignKey("ListedNamesId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
{
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
.WithMany()
.HasForeignKey("RoleId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
{
b.HasOne("OpenArchival.DataAccess.ApplicationUser", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
{
b.HasOne("OpenArchival.DataAccess.ApplicationUser", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b =>
{
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
.WithMany()
.HasForeignKey("RoleId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("OpenArchival.DataAccess.ApplicationUser", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b =>
{
b.HasOne("OpenArchival.DataAccess.ApplicationUser", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("OpenArchival.DataAccess.ArtifactEntry", b =>
{
b.HasOne("OpenArchival.DataAccess.ArtifactGrouping", "ArtifactGrouping")
.WithMany("ChildArtifactEntries")
.HasForeignKey("ArtifactGroupingId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("OpenArchival.DataAccess.ArtifactStorageLocation", "StorageLocation")
.WithMany("ArtifactEntries")
.HasForeignKey("StorageLocationId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("OpenArchival.DataAccess.ArtifactType", "Type")
.WithMany("ArtifactEntries")
.HasForeignKey("TypeId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("ArtifactGrouping");
b.Navigation("StorageLocation");
b.Navigation("Type");
});
modelBuilder.Entity("OpenArchival.DataAccess.ArtifactGrouping", b =>
{
b.HasOne("OpenArchival.DataAccess.ArchiveCategory", "Category")
.WithMany()
.HasForeignKey("CategoryId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("OpenArchival.DataAccess.ArtifactType", "Type")
.WithMany()
.HasForeignKey("TypeId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.OwnsOne("OpenArchival.DataAccess.IdentifierFields", "IdentifierFields", b1 =>
{
b1.Property<int>("ArtifactGroupingId")
.HasColumnType("integer");
b1.PrimitiveCollection<List<string>>("Values")
.IsRequired()
.HasColumnType("text[]");
b1.HasKey("ArtifactGroupingId");
b1.ToTable("ArtifactGroupings");
b1.ToJson("IdentifierFields");
b1.WithOwner()
.HasForeignKey("ArtifactGroupingId");
});
b.Navigation("Category");
b.Navigation("IdentifierFields")
.IsRequired();
b.Navigation("Type");
});
modelBuilder.Entity("OpenArchival.DataAccess.FilePathListing", b =>
{
b.HasOne("OpenArchival.DataAccess.ArtifactGrouping", null)
.WithMany("ChildFilePathListings")
.HasForeignKey("ArtifactGroupingId");
b.HasOne("OpenArchival.DataAccess.ArtifactEntry", "ParentArtifactEntry")
.WithMany("Files")
.HasForeignKey("ParentArtifactEntryId")
.OnDelete(DeleteBehavior.Cascade);
b.Navigation("ParentArtifactEntry");
});
modelBuilder.Entity("OpenArchival.DataAccess.ArtifactEntry", b =>
{
b.Navigation("Files");
});
modelBuilder.Entity("OpenArchival.DataAccess.ArtifactGrouping", b =>
{
b.Navigation("ChildArtifactEntries");
b.Navigation("ChildFilePathListings");
});
modelBuilder.Entity("OpenArchival.DataAccess.ArtifactStorageLocation", b =>
{
b.Navigation("ArtifactEntries");
});
modelBuilder.Entity("OpenArchival.DataAccess.ArtifactType", b =>
{
b.Navigation("ArtifactEntries");
});
#pragma warning restore 612, 618
}
}
}

View File

@@ -0,0 +1,48 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace OpenArchival.DataAccess.Migrations
{
/// <inheritdoc />
public partial class AddedCSharpCalculatedProperty : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<int>(
name: "ArtifactGroupingId",
table: "ArtifactFilePaths",
type: "integer",
nullable: true);
migrationBuilder.CreateIndex(
name: "IX_ArtifactFilePaths_ArtifactGroupingId",
table: "ArtifactFilePaths",
column: "ArtifactGroupingId");
migrationBuilder.AddForeignKey(
name: "FK_ArtifactFilePaths_ArtifactGroupings_ArtifactGroupingId",
table: "ArtifactFilePaths",
column: "ArtifactGroupingId",
principalTable: "ArtifactGroupings",
principalColumn: "Id");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_ArtifactFilePaths_ArtifactGroupings_ArtifactGroupingId",
table: "ArtifactFilePaths");
migrationBuilder.DropIndex(
name: "IX_ArtifactFilePaths_ArtifactGroupingId",
table: "ArtifactFilePaths");
migrationBuilder.DropColumn(
name: "ArtifactGroupingId",
table: "ArtifactFilePaths");
}
}
}

View File

@@ -474,6 +474,9 @@ namespace OpenArchival.DataAccess.Migrations
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<int?>("ArtifactGroupingId")
.HasColumnType("integer");
b.Property<string>("OriginalName")
.IsRequired()
.HasColumnType("text");
@@ -487,6 +490,8 @@ namespace OpenArchival.DataAccess.Migrations
b.HasKey("Id");
b.HasIndex("ArtifactGroupingId");
b.HasIndex("ParentArtifactEntryId");
b.ToTable("ArtifactFilePaths");
@@ -690,9 +695,14 @@ namespace OpenArchival.DataAccess.Migrations
modelBuilder.Entity("OpenArchival.DataAccess.FilePathListing", b =>
{
b.HasOne("OpenArchival.DataAccess.ArtifactGrouping", null)
.WithMany("ChildFilePathListings")
.HasForeignKey("ArtifactGroupingId");
b.HasOne("OpenArchival.DataAccess.ArtifactEntry", "ParentArtifactEntry")
.WithMany("Files")
.HasForeignKey("ParentArtifactEntryId");
.HasForeignKey("ParentArtifactEntryId")
.OnDelete(DeleteBehavior.Cascade);
b.Navigation("ParentArtifactEntry");
});
@@ -705,6 +715,8 @@ namespace OpenArchival.DataAccess.Migrations
modelBuilder.Entity("OpenArchival.DataAccess.ArtifactGrouping", b =>
{
b.Navigation("ChildArtifactEntries");
b.Navigation("ChildFilePathListings");
});
modelBuilder.Entity("OpenArchival.DataAccess.ArtifactStorageLocation", b =>

View File

@@ -59,7 +59,6 @@ public class ArtifactEntry
// Relationships other artifacts have TO this artifact
public List<ArtifactEntry> RelatedBy { get; set; } = [];
public int ArtifactGroupingId { get; set; }
public required ArtifactGrouping ArtifactGrouping { get; set; }

View File

@@ -18,4 +18,9 @@ public class ArtifactEntryTag
public required string Name { get; set; }
public List<ArtifactEntry> ArtifactEntries { get; set; } = [];
public override string ToString()
{
return Name;
}
}

View File

@@ -19,6 +19,20 @@ public class ArtifactGrouping
}
}
public List<FilePathListing> ChildFilePathListings
{
get
{
var list = new List<FilePathListing>();
foreach (ArtifactEntry entry in ChildArtifactEntries)
{
list.AddRange(entry.Files);
}
return list;
}
}
public required ArchiveCategory Category { get; set; }
private IdentifierFields _identifierFields;
@@ -35,7 +49,6 @@ public class ArtifactGrouping
}
}
public required string Title { get; set; }
public string? Description { get; set; }

View File

@@ -12,4 +12,9 @@ public class ListedName
public required string Value { get; set; }
public List<ArtifactEntry> ArtifactEntries { get; set; } = [];
public override string ToString()
{
return Value;
}
}

View File

@@ -29,13 +29,12 @@ public class ArtifactGroupingProvider : IArtifactGroupingProvider
.ThenInclude(e => e.Type)
.Include(g => g.ChildArtifactEntries)
.ThenInclude(e => e.Files)
.Include(g=> g.ChildArtifactEntries)
.Include(g => g.ChildArtifactEntries)
.ThenInclude(e => e.Tags)
.Include(g => g.ChildArtifactEntries)
.ThenInclude(e => e.ListedNames)
.Include(g => g.ChildArtifactEntries)
.ThenInclude(e => e.Defects)
.Where(g => g.Id == id)
.FirstOrDefaultAsync();
}
@@ -66,50 +65,178 @@ public class ArtifactGroupingProvider : IArtifactGroupingProvider
{
await using var context = await _context.CreateDbContextAsync();
// Iterate through all child entries and their file paths.
// Attach the Category to the context. If it has a key, it will be tracked.
context.Attach(grouping.Category);
var processedTypes = new Dictionary<string, ArtifactType>();
// Helper function to get a de-duplicated type
async Task<ArtifactType> GetUniqueTypeAsync(ArtifactType typeToProcess)
{
// If the type is null or has no name, do nothing.
if (string.IsNullOrEmpty(typeToProcess?.Name))
{
return typeToProcess;
}
// A. First, check our local cache for the type.
if (processedTypes.TryGetValue(typeToProcess.Name, out var uniqueType))
{
// Found it in the cache! Return the single instance we're tracking.
return uniqueType;
}
// B. If not in the cache, check the database.
var dbType = await context.ArtifactTypes.FirstOrDefaultAsync(t => t.Name == typeToProcess.Name);
if (dbType != null)
{
// Found it in the database. Add it to our cache for next time.
processedTypes[dbType.Name] = dbType;
return dbType;
}
// C. It's a brand new type. Add the new instance to our cache.
processedTypes[typeToProcess.Name] = typeToProcess;
return typeToProcess;
}
// 2. De-duplicate the main grouping's type
grouping.Type = await GetUniqueTypeAsync(grouping.Type);
// Iterate through all child entries to handle their related entities.
foreach (var entry in grouping.ChildArtifactEntries)
{
// Create a temporary list to hold the managed file path entities.
var managedFilePaths = new List<FilePathListing>();
// Handle Artifact Types
// Check if the type exists in the database.
var existingType = await GetUniqueTypeAsync(entry.Type);
entry.Type = existingType;
// Handle Storage Location
// Check if the storage location exists in the database.
var existingLocation = await context.ArtifactStorageLocations.FirstOrDefaultAsync(l => l.Location == entry.StorageLocation.Location);
if (existingLocation != null)
{
// If it exists, replace the disconnected object with the tracked one.
entry.StorageLocation = existingLocation;
}
// Handle each file path in the entry.
// Handle Tags
// Create a temporary list to hold the managed tag entities.
var managedTags = new List<ArtifactEntryTag>();
foreach (var tag in entry.Tags)
{
// Attempt to find the tag in the database.
var existingTag = await context.ArtifactEntryTags.FirstOrDefaultAsync(t => t.Name == tag.Name);
if (existingTag != null)
{
// The tag already exists. Use the tracked instance.
managedTags.Add(existingTag);
}
else
{
// The tag is new. Add it to the managed list.
managedTags.Add(tag);
}
}
// Replace the disconnected tag objects on the entry with the managed ones.
entry.Tags = managedTags;
// Handle Listed Names
// Create a temporary list to hold the managed name entities.
var managedNames = new List<ListedName>();
foreach (var name in entry.ListedNames)
{
// Attempt to find the listed name in the database.
var existingName = await context.ArtifactAssociatedNames.FirstOrDefaultAsync(n => n.Value == name.Value);
if (existingName != null)
{
// The name already exists. Use the tracked instance.
managedNames.Add(existingName);
}
else
{
// The name is new. Add it to the managed list.
managedNames.Add(name);
}
}
// Replace the disconnected name objects on the entry with the managed ones.
entry.ListedNames = managedNames;
// Handle Defects
// Create a temporary list to hold the managed defect entities.
var managedDefects = new List<ArtifactDefect>();
foreach (var defect in entry.Defects)
{
// Attempt to find the defect in the database.
var existingDefect = await context.ArtifactDefects.FirstOrDefaultAsync(d => d.Description == defect.Description);
if (existingDefect != null)
{
// The defect already exists. Use the tracked instance.
managedDefects.Add(existingDefect);
}
else
{
// The defect is new. Add it to the managed list.
managedDefects.Add(defect);
}
}
// Replace the disconnected defect objects on the entry with the managed ones.
entry.Defects = managedDefects;
// Handle file paths. This is the original logic you provided.
var managedFilePaths = new List<FilePathListing>();
foreach (var filepath in entry.Files)
{
// Attempt to find the file path in the database.
var existingFilePath = await context.ArtifactFilePaths.FirstOrDefaultAsync(f => f.Path == filepath.Path);
if (existingFilePath != null)
{
// The file path already exists. Use the tracked instance.
managedFilePaths.Add(existingFilePath);
}
else
{
// The file path is new. Add it to the managed list.
managedFilePaths.Add(filepath);
}
}
// Replace the disconnected file path objects on the entry with the managed ones.
entry.Files = managedFilePaths;
}
context.ArtifactGroupings.Add(grouping);
// Add the new grouping and save changes.
//context.ArtifactGroupings.Add(grouping);
context.ChangeTracker.TrackGraph(grouping, node =>
{
// If the entity's key is set, EF should treat it as an existing, unchanged entity.
if (node.Entry.IsKeySet)
{
node.Entry.State = EntityState.Unchanged;
}
// Otherwise, it's a new entity that needs to be inserted.
else
{
node.Entry.State = EntityState.Added;
}
});
await context.SaveChangesAsync();
}
public async Task UpdateGroupingAsync(ArtifactGrouping grouping)
/*
public async Task UpdateGroupingAsync(ArtifactGrouping updatedGrouping)
{
// The DbContext is provided externally, so we will use it as is.
// Assuming you have an instance available, e.g., via a constructor or method parameter.
await using var context = await _context.CreateDbContextAsync();
// **NEW LOGIC**
// Fetch the existing, tracked entity and its entire graph.
// 1. Retrieve the existing grouping object from the database, eagerly loading all related data.
// This is crucial for correctly handling all relationships.
var existingGrouping = await context.ArtifactGroupings
.Include(g => g.Category)
.Include(g => g.Type)
.Include(g => g.IdentifierFields)
.Include(g => g.Type)
.Include(g => g.ChildArtifactEntries)
.ThenInclude(e => e.StorageLocation)
.Include(g => g.ChildArtifactEntries)
.ThenInclude(e => e.Type)
.Include(g => g.ChildArtifactEntries)
.ThenInclude(e => e.Files)
.Include(g => g.ChildArtifactEntries)
@@ -118,68 +245,367 @@ public class ArtifactGroupingProvider : IArtifactGroupingProvider
.ThenInclude(e => e.ListedNames)
.Include(g => g.ChildArtifactEntries)
.ThenInclude(e => e.Defects)
.FirstOrDefaultAsync(g => g.Id == grouping.Id);
.Where(g => g.Id == updatedGrouping.Id)
.FirstOrDefaultAsync();
if (existingGrouping == null)
{
throw new InvalidOperationException($"Grouping with ID {grouping.Id} not found for update.");
// The grouping does not exist. You may want to throw an exception or handle this case.
return;
}
// Update top-level properties.
existingGrouping.Title = grouping.Title;
existingGrouping.IsPublicallyVisible = grouping.IsPublicallyVisible;
existingGrouping.Description = grouping.Description;
// 2. Manually copy over primitive properties.
existingGrouping.Title = updatedGrouping.Title;
existingGrouping.Description = updatedGrouping.Description;
existingGrouping.IsPublicallyVisible = updatedGrouping.IsPublicallyVisible;
existingGrouping.IdentifierFields = updatedGrouping.IdentifierFields;
// Manually manage collections to sync the in-memory graph.
var entriesInModel = grouping.ChildArtifactEntries.ToDictionary(e => e.Id);
// Remove entries from the database that are no longer in the model.
existingGrouping.ChildArtifactEntries.RemoveAll(e => !entriesInModel.ContainsKey(e.Id));
// Add or update existing entries.
foreach (var entryInModel in grouping.ChildArtifactEntries)
// Handle one-to-many relationships (Type, Category).
// Find the existing related entity and attach it to the tracked graph.
var existingGroupingType = await context.ArtifactTypes.FirstOrDefaultAsync(t => t.Name == updatedGrouping.Type.Name);
if (existingGroupingType != null)
{
var existingEntry = existingGrouping.ChildArtifactEntries.FirstOrDefault(e => e.Id == entryInModel.Id);
existingGrouping.Type = existingGroupingType;
}
else
{
existingGrouping.Type = updatedGrouping.Type;
}
// Attach the category as specified
if (existingGrouping.Category.Name != updatedGrouping.Category.Name)
{
existingGrouping.Category = updatedGrouping.Category;
context.Add(existingGrouping.Category);
}
// 3. Synchronize the ChildArtifactEntries collection.
// First, remove any entries that were deleted in the DTO.
var updatedEntryIds = updatedGrouping.ChildArtifactEntries.Select(e => e.Id).ToList();
var entriesToRemove = existingGrouping.ChildArtifactEntries
.Where(e => !updatedEntryIds.Contains(e.Id))
.ToList();
foreach (var entryToRemove in entriesToRemove)
{
existingGrouping.ChildArtifactEntries.Remove(entryToRemove);
}
// Now, loop through the updated entries to handle updates and additions.
foreach (var updatedEntry in updatedGrouping.ChildArtifactEntries)
{
var existingEntry = existingGrouping.ChildArtifactEntries
.FirstOrDefault(e => e.Id == updatedEntry.Id);
if (existingEntry != null)
{
// Update an EXISTING entry.
existingEntry.Title = entryInModel.Title;
// Sync the files collection.
var filesInModel = entryInModel.Files.Select(f => f.Path).ToHashSet();
existingEntry.Files.RemoveAll(f => !filesInModel.Contains(f.Path));
// The entry exists, so manually update its properties.
existingEntry.Title = updatedEntry.Title;
existingEntry.Description = updatedEntry.Description;
existingEntry.ArtifactNumber = updatedEntry.ArtifactNumber;
existingEntry.IsPubliclyVisible = updatedEntry.IsPubliclyVisible;
existingEntry.AssociatedDates = updatedEntry.AssociatedDates;
existingEntry.FileTextContent = updatedEntry.FileTextContent;
var newFilesToRelate = filesInModel.Except(existingEntry.Files.Select(f => f.Path));
foreach (var filePath in newFilesToRelate)
// Handle one-to-many relationships (StorageLocation, Type)
var existingLocation = await context.ArtifactStorageLocations.FirstOrDefaultAsync(l => l.Location == updatedEntry.StorageLocation.Location);
if (existingLocation != null)
{
var fileToAdd = await context.ArtifactFilePaths.FirstOrDefaultAsync(f => f.Path == filePath);
if (fileToAdd != null)
{
existingEntry.Files.Add(fileToAdd);
}
existingEntry.StorageLocation = existingLocation;
}
else
{
existingEntry.StorageLocation = updatedEntry.StorageLocation;
context.Add(existingEntry.StorageLocation);
}
var existingType = await context.ArtifactTypes.FirstOrDefaultAsync(t => t.Name == updatedEntry.Type.Name);
if (existingType != null)
{
existingEntry.Type = existingType;
}
else
{
existingEntry.Type = updatedEntry.Type;
context.Add(existingEntry.Type);
}
// Synchronize many-to-many collections.
// This is the most complex part. We need to handle adds and removals.
// Helper function to handle a generic collection sync.
await SyncCollectionAsync<ArtifactEntryTag, string>(context, existingEntry.Tags, updatedEntry.Tags, t => t.Name);
await SyncCollectionAsync<ListedName, string>(context, existingEntry.ListedNames, updatedEntry.ListedNames, n => n.Value);
await SyncCollectionAsync<ArtifactDefect, string>(context, existingEntry.Defects, updatedEntry.Defects, d => d.Description);
}
else
{
// Add a NEW entry to the existing grouping.
var newEntry = entryInModel;
// For this new entry, handle the file path relationships.
var existingFiles = await context.ArtifactFilePaths
.Where(fp => newEntry.Files.Select(f => f.Path).Contains(fp.Path))
.ToListAsync();
newEntry.Files.Clear();
foreach (var existingFile in existingFiles)
{
newEntry.Files.Add(existingFile);
}
existingGrouping.ChildArtifactEntries.Add(newEntry);
// The entry is new, so add it to the tracked collection.
existingGrouping.ChildArtifactEntries.Add(updatedEntry);
}
}
// 4. Save all changes.
await context.SaveChangesAsync();
}
*/
public async Task UpdateGroupingAsync(ArtifactGrouping updatedGrouping)
{
// The DbContext is provided externally, so we will use it as is.
// Assuming you have an instance available, e.g., via a constructor or method parameter.
await using var context = await _context.CreateDbContextAsync();
// 1. Retrieve the existing grouping object from the database, eagerly loading all related data.
// This is crucial for correctly handling all relationships.
var existingGrouping = await context.ArtifactGroupings
.Include(g => g.Category)
.Include(g => g.IdentifierFields)
.Include(g => g.Type)
.Include(g => g.ChildArtifactEntries)
.ThenInclude(e => e.StorageLocation)
.Include(g => g.ChildArtifactEntries)
.ThenInclude(e => e.Type)
.Include(g => g.ChildArtifactEntries)
.ThenInclude(e => e.Files)
.Include(g => g.ChildArtifactEntries)
.ThenInclude(e => e.Tags)
.Include(g => g.ChildArtifactEntries)
.ThenInclude(e => e.ListedNames)
.Include(g => g.ChildArtifactEntries)
.ThenInclude(e => e.Defects)
.Where(g => g.Id == updatedGrouping.Id)
.FirstOrDefaultAsync();
if (existingGrouping == null)
{
// The grouping does not exist. You may want to throw an exception or handle this case.
return;
}
// 2. Manually copy over primitive properties.
existingGrouping.Title = updatedGrouping.Title;
existingGrouping.Description = updatedGrouping.Description;
existingGrouping.IsPublicallyVisible = updatedGrouping.IsPublicallyVisible;
existingGrouping.IdentifierFields = updatedGrouping.IdentifierFields;
// Handle one-to-many relationships (Type, Category).
// Find the existing related entity and attach it to the tracked graph.
var existingGroupingType = await context.ArtifactTypes.FirstOrDefaultAsync(t => t.Name == updatedGrouping.Type.Name);
if (existingGroupingType != null)
{
existingGrouping.Type = existingGroupingType;
}
else
{
existingGrouping.Type = updatedGrouping.Type;
}
// Attach the category as specified
if (existingGrouping.Category.Name != updatedGrouping.Category.Name)
{
existingGrouping.Category = updatedGrouping.Category;
context.Add(existingGrouping.Category);
}
// 3. Synchronize the ChildArtifactEntries collection.
// First, remove any entries that were deleted in the DTO.
var updatedEntryIds = updatedGrouping.ChildArtifactEntries.Select(e => e.Id).ToList();
var entriesToRemove = existingGrouping.ChildArtifactEntries
.Where(e => !updatedEntryIds.Contains(e.Id))
.ToList();
foreach (var entryToRemove in entriesToRemove)
{
existingGrouping.ChildArtifactEntries.Remove(entryToRemove);
}
// Now, loop through the updated entries to handle updates and additions.
foreach (var updatedEntry in updatedGrouping.ChildArtifactEntries)
{
// FIRST, de-duplicate all related entities on the incoming entry.
var existingEntry = existingGrouping.ChildArtifactEntries
.FirstOrDefault(e => e.Id == updatedEntry.Id);
await DeDuplicateEntryRelationsAsync(context, updatedEntry);
if (existingEntry != null)
{
// The entry exists, so manually update its properties.
existingEntry.Title = updatedEntry.Title;
existingEntry.Description = updatedEntry.Description;
existingEntry.ArtifactNumber = updatedEntry.ArtifactNumber;
existingEntry.IsPubliclyVisible = updatedEntry.IsPubliclyVisible;
existingEntry.AssociatedDates = updatedEntry.AssociatedDates;
existingEntry.FileTextContent = updatedEntry.FileTextContent;
existingEntry.Files = updatedEntry.Files;
// The relations on updatedEntry are already de-duplicated, so just assign them.
existingEntry.StorageLocation = updatedEntry.StorageLocation;
existingEntry.Type = updatedEntry.Type;
// For collections, clear the old ones and add the new de-duplicated ones.
existingEntry.Tags.Clear();
updatedEntry.Tags.ForEach(tag => existingEntry.Tags.Add(tag));
existingEntry.ListedNames.Clear();
updatedEntry.ListedNames.ForEach(name => existingEntry.ListedNames.Add(name));
existingEntry.Defects.Clear();
updatedEntry.Defects.ForEach(defect => existingEntry.Defects.Add(defect));
}
else
{
// The entry is new and its children are already de-duplicated, so just add it.
existingGrouping.ChildArtifactEntries.Add(updatedEntry);
}
}
// 4. Save all changes.
await context.SaveChangesAsync();
}
private async Task DeDuplicateEntryRelationsAsync(ApplicationDbContext context, ArtifactEntry entry)
{
// --- Handle One-to-Many Relationships ---
var existingLocation = await context.ArtifactStorageLocations.FirstOrDefaultAsync(l => l.Location == entry.StorageLocation.Location);
if (existingLocation != null)
{
entry.StorageLocation = existingLocation;
}
var existingType = await context.ArtifactTypes.FirstOrDefaultAsync(t => t.Name == entry.Type.Name);
if (existingType != null)
{
entry.Type = existingType;
}
// --- Handle Many-to-Many Relationships ---
// De-duplicate Tags
var processedTags = new List<ArtifactEntryTag>();
foreach (var tag in entry.Tags)
{
var existingTag = await context.ArtifactEntryTags.FirstOrDefaultAsync(t => t.Name == tag.Name) ?? tag;
processedTags.Add(existingTag);
}
entry.Tags = processedTags;
// De-duplicate ListedNames
var processedNames = new List<ListedName>();
if (entry.ListedNames != null)
{
foreach (var name in entry.ListedNames)
{
var existingName = await context.ArtifactAssociatedNames.FirstOrDefaultAsync(n => n.Value == name.Value) ?? name;
processedNames.Add(existingName);
}
entry.ListedNames = processedNames;
}
// De-duplicate Defects
var processedDefects = new List<ArtifactDefect>();
if (entry.Defects != null)
{
foreach (var defect in entry.Defects)
{
var existingDefect = await context.ArtifactDefects.FirstOrDefaultAsync(d => d.Description == defect.Description) ?? defect;
processedDefects.Add(existingDefect);
}
entry.Defects = processedDefects;
}
if (entry.Files.Any())
{
// 1. Get the IDs from the incoming, untracked file objects.
var inputFileIds = entry.Files.Select(f => f.Id).ToList();
// 2. Fetch the actual, tracked entities from the database.
var trackedFiles = await context.ArtifactFilePaths
.Where(dbFile => inputFileIds.Contains(dbFile.Id))
.ToListAsync();
// 3. Replace the untracked collection with the tracked one.
entry.Files = trackedFiles;
}
}
/// <summary>
/// A helper method to synchronize many-to-many collections.
/// </summary>
private async Task SyncCollectionAsync<TEntity, TKey>(
DbContext context,
ICollection<TEntity> existingItems,
ICollection<TEntity> updatedItems,
Func<TEntity, TKey> keySelector) where TEntity : class
{
var existingKeys = existingItems.Select(keySelector).ToHashSet();
var updatedKeys = updatedItems.Select(keySelector).ToHashSet();
// 1. Remove items that are no longer in the updated collection
var keysToRemove = existingKeys.Except(updatedKeys);
var itemsToRemove = existingItems.Where(item => keysToRemove.Contains(keySelector(item))).ToList();
foreach (var item in itemsToRemove)
{
existingItems.Remove(item);
}
// 2. Identify keys for brand new items
var keysToAdd = updatedKeys.Except(existingKeys).ToList();
if (!keysToAdd.Any())
{
return; // Nothing to add
}
// 3. Batch-fetch all entities from the DB that match the new keys.
// This is the key change to make the query translatable to SQL.
Dictionary<TKey, TEntity> existingDbItemsMap = [];
if (typeof(TEntity) == typeof(ArtifactEntryTag))
{
var tagKeys = keysToAdd.Cast<string>().ToList();
var tags = await context.Set<ArtifactEntryTag>()
.Where(t => tagKeys.Contains(t.Name))
.ToListAsync();
existingDbItemsMap = tags.ToDictionary(t => (TKey)(object)t.Name) as Dictionary<TKey, TEntity>;
}
else if (typeof(TEntity) == typeof(ListedName))
{
var nameKeys = keysToAdd.Cast<string>().ToList();
var names = await context.Set<ListedName>()
.Where(n => nameKeys.Contains(n.Value))
.ToListAsync();
existingDbItemsMap = names.ToDictionary(n => (TKey)(object)n.Value) as Dictionary<TKey, TEntity>;
}
else if (typeof(TEntity) == typeof(ArtifactDefect))
{
var defectKeys = keysToAdd.Cast<string>().ToList();
var defects = await context.Set<ArtifactDefect>()
.Where(d => defectKeys.Contains(d.Description))
.ToListAsync();
existingDbItemsMap = defects.ToDictionary(d => (TKey)(object)d.Description) as Dictionary<TKey, TEntity>;
}
// 4. Add the items, using the tracked entity from the DB if it exists.
foreach (var updatedItem in updatedItems.Where(i => keysToAdd.Contains(keySelector(i))))
{
var key = keySelector(updatedItem);
if (existingDbItemsMap.TryGetValue(key, out var dbItem))
{
// The item already exists in the DB, so add the tracked version.
existingItems.Add(dbItem);
}
else
{
// This is a brand new item, so add the untracked one from the input.
existingItems.Add(updatedItem);
}
}
}
public async Task DeleteGroupingAsync(int id)
{

View File

@@ -15,7 +15,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("OpenArchival.DataAccess")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+77318e87d12fb2935cd521cd7ef445296c08f8af")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+781793a27f2e164808340b1adb5ce70e1800b187")]
[assembly: System.Reflection.AssemblyProductAttribute("OpenArchival.DataAccess")]
[assembly: System.Reflection.AssemblyTitleAttribute("OpenArchival.DataAccess")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]

View File

@@ -1 +1 @@
e331b97ff893169d9154fb7894ef5ce9b6c2a2cd9aabaaf72be6a68f4d5d8c95
92606188c317e23ff44b4fabe3b8bf357fc271c61d0643bc6e067683aa19c223

View File

@@ -17,13 +17,13 @@ build_property._SupportedPlatformList = Linux,macOS,Windows
build_property._SupportedPlatformList = Linux,macOS,Windows
build_property.RootNamespace = OpenArchival.DataAccess
build_property.RootNamespace = OpenArchival.DataAccess
build_property.ProjectDir = D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\
build_property.ProjectDir = C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\
build_property.EnableComHosting =
build_property.EnableGeneratedComInterfaceComImportInterop =
build_property.RazorLangVersion = 9.0
build_property.SupportLocalizedComponentNames =
build_property.GenerateRazorMetadataSourceChecksumAttributes =
build_property.MSBuildProjectDirectory = D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess
build_property.MSBuildProjectDirectory = C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess
build_property._RazorSourceGeneratorDebug =
build_property.EffectiveAnalysisLevelStyle = 9.0
build_property.EnableCodeStyleSeverity =

View File

@@ -1 +1 @@
99b0f9982e395da4abb36a71ea11038d61049127fc999806dea0b117d58b8c73
6aa685bc447c267fa362516984567e383354e1f99d47dc97b7702778cc0c6de8

View File

@@ -590,3 +590,153 @@ D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\re
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\OpenArchival.DataAccess.pdb
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\OpenArchival.DataAccess.genruntimeconfig.cache
D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\ref\OpenArchival.DataAccess.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\OpenArchival.DataAccess.staticwebassets.endpoints.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\OpenArchival.DataAccess.exe
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\OpenArchival.DataAccess.deps.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\OpenArchival.DataAccess.runtimeconfig.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\OpenArchival.DataAccess.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\OpenArchival.DataAccess.pdb
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\EntityFramework.SqlServer.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\EntityFramework.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\Humanizer.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\Microsoft.AspNetCore.Cryptography.Internal.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\Microsoft.AspNetCore.Cryptography.KeyDerivation.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\Microsoft.AspNetCore.Identity.EntityFrameworkCore.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\Microsoft.Bcl.AsyncInterfaces.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\Microsoft.Build.Locator.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\Microsoft.CodeAnalysis.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\Microsoft.CodeAnalysis.CSharp.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\Microsoft.CodeAnalysis.CSharp.Workspaces.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\Microsoft.CodeAnalysis.Workspaces.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\Microsoft.CodeAnalysis.Workspaces.MSBuild.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\Microsoft.EntityFrameworkCore.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\Microsoft.EntityFrameworkCore.Abstractions.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\Microsoft.EntityFrameworkCore.Design.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\Microsoft.EntityFrameworkCore.Relational.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\Microsoft.Extensions.Caching.Abstractions.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\Microsoft.Extensions.Caching.Memory.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\Microsoft.Extensions.Configuration.Abstractions.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\Microsoft.Extensions.DependencyInjection.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\Microsoft.Extensions.DependencyInjection.Abstractions.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\Microsoft.Extensions.DependencyModel.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\Microsoft.Extensions.Identity.Core.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\Microsoft.Extensions.Identity.Stores.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\Microsoft.Extensions.Logging.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\Microsoft.Extensions.Logging.Abstractions.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\Microsoft.Extensions.Options.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\Microsoft.Extensions.Primitives.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\Microsoft.Win32.SystemEvents.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\Mono.TextTemplating.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\Npgsql.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\Npgsql.EntityFrameworkCore.PostgreSQL.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\System.CodeDom.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\System.Composition.AttributedModel.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\System.Composition.Convention.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\System.Composition.Hosting.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\System.Composition.Runtime.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\System.Composition.TypedParts.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\System.Configuration.ConfigurationManager.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\System.Data.SqlClient.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\System.Drawing.Common.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\System.Security.Cryptography.ProtectedData.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\System.Security.Permissions.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\System.Windows.Extensions.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\cs\Microsoft.CodeAnalysis.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\de\Microsoft.CodeAnalysis.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\es\Microsoft.CodeAnalysis.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\fr\Microsoft.CodeAnalysis.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\it\Microsoft.CodeAnalysis.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\ja\Microsoft.CodeAnalysis.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\ko\Microsoft.CodeAnalysis.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\pl\Microsoft.CodeAnalysis.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\pt-BR\Microsoft.CodeAnalysis.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\ru\Microsoft.CodeAnalysis.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\tr\Microsoft.CodeAnalysis.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\zh-Hans\Microsoft.CodeAnalysis.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\zh-Hant\Microsoft.CodeAnalysis.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\cs\Microsoft.CodeAnalysis.CSharp.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\de\Microsoft.CodeAnalysis.CSharp.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\es\Microsoft.CodeAnalysis.CSharp.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\fr\Microsoft.CodeAnalysis.CSharp.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\it\Microsoft.CodeAnalysis.CSharp.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\ja\Microsoft.CodeAnalysis.CSharp.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\ko\Microsoft.CodeAnalysis.CSharp.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\pl\Microsoft.CodeAnalysis.CSharp.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\pt-BR\Microsoft.CodeAnalysis.CSharp.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\ru\Microsoft.CodeAnalysis.CSharp.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\tr\Microsoft.CodeAnalysis.CSharp.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\zh-Hans\Microsoft.CodeAnalysis.CSharp.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\zh-Hant\Microsoft.CodeAnalysis.CSharp.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\cs\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\de\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\es\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\fr\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\it\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\ja\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\ko\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\pl\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\pt-BR\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\ru\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\tr\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\zh-Hans\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\zh-Hant\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\cs\Microsoft.CodeAnalysis.Workspaces.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\de\Microsoft.CodeAnalysis.Workspaces.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\es\Microsoft.CodeAnalysis.Workspaces.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\fr\Microsoft.CodeAnalysis.Workspaces.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\it\Microsoft.CodeAnalysis.Workspaces.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\ja\Microsoft.CodeAnalysis.Workspaces.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\ko\Microsoft.CodeAnalysis.Workspaces.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\pl\Microsoft.CodeAnalysis.Workspaces.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\pt-BR\Microsoft.CodeAnalysis.Workspaces.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\ru\Microsoft.CodeAnalysis.Workspaces.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\tr\Microsoft.CodeAnalysis.Workspaces.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\zh-Hans\Microsoft.CodeAnalysis.Workspaces.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\zh-Hant\Microsoft.CodeAnalysis.Workspaces.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\cs\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\de\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\es\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\fr\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\it\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\ja\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\ko\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\pl\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\pt-BR\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\ru\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\tr\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\zh-Hans\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\zh-Hant\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\runtimes\win\lib\net6.0\Microsoft.Win32.SystemEvents.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\runtimes\win-arm64\native\sni.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\runtimes\win-x64\native\sni.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\runtimes\win-x86\native\sni.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\runtimes\unix\lib\netcoreapp2.1\System.Data.SqlClient.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\runtimes\win\lib\netcoreapp2.1\System.Data.SqlClient.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\runtimes\unix\lib\net6.0\System.Drawing.Common.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\runtimes\win\lib\net6.0\System.Drawing.Common.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\runtimes\win\lib\net6.0\System.Security.Cryptography.ProtectedData.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\bin\Debug\net9.0\runtimes\win\lib\net6.0\System.Windows.Extensions.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\OpenArchival.DataAccess.csproj.AssemblyReference.cache
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\rpswa.dswa.cache.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\OpenArchival.DataAccess.GeneratedMSBuildEditorConfig.editorconfig
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\OpenArchival.DataAccess.AssemblyInfoInputs.cache
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\OpenArchival.DataAccess.AssemblyInfo.cs
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\OpenArchival.DataAccess.csproj.CoreCompileInputs.cache
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\OpenArchival.DataAccess.MvcApplicationPartsAssemblyInfo.cache
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\OpenArchival.DataAccess.sourcelink.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\rjimswa.dswa.cache.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\rjsmrazor.dswa.cache.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\rjsmcshtml.dswa.cache.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\scopedcss\bundle\OpenArchival.DataAccess.styles.css
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.json.cache
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.development.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.build.endpoints.json
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\staticwebassets.upToDateCheck.txt
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\OpenArch.D40B5A94.Up2Date
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\OpenArchival.DataAccess.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\refint\OpenArchival.DataAccess.dll
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\OpenArchival.DataAccess.pdb
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\OpenArchival.DataAccess.genruntimeconfig.cache
C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\obj\Debug\net9.0\ref\OpenArchival.DataAccess.dll

View File

@@ -1 +1 @@
da0a04e4e54dc974e94d8c1063ec630c247cb827f3d41b1ae6eb278ec5187927
0eb107fd36a1748624ff9544feb151aebf888938f8de2a42ea29dd1f8c079d78

View File

@@ -1 +1 @@
{"documents":{"D:\\Nextcloud\\Documents\\Open-Archival\\*":"https://raw.githubusercontent.com/vtallen/Open-Archival/77318e87d12fb2935cd521cd7ef445296c08f8af/*"}}
{"documents":{"C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\*":"https://raw.githubusercontent.com/vtallen/Open-Archival/781793a27f2e164808340b1adb5ce70e1800b187/*"}}

View File

@@ -1 +1 @@
{"GlobalPropertiesHash":"J3r5h7pKF0kY0DRJx0Xqba86ngtHs3jduVq7GPX+nwI=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["aDrxgmPzfmAYNrzynmphKXORQNARBvx3ZJm3IcIlVIA=","dFQa1Ee6LWN6QaEoa8lulEtbH6imVMCsVrPTv7uB7rA=","KAWcEu8sopHLr7dsoLsr\u002Bz7vrHN0YxMtmdfBYeH1kwI=","\u002Bjyo4JejKGZVNH7yAY1POV7dsMBGmszgVLUsVwm0S6Y=","EuerEavGnRoNMMU450G02s4QgrYiGKZsiuKOVP7kEc0="],"CachedAssets":{},"CachedCopyCandidates":{}}
{"GlobalPropertiesHash":"vveeLoVRblwaOOqBmVqvQ4HG2rSqMixgk7cSXmvYrIw=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["qgBHL5R0mKXCiq65NnDep\u002B28SIMEandMOx72nKFCKds=","CFcBWGOCg2CGlH8Oj1fZ3/w1ogRq/hhCDREdOMIEOHQ=","Hr\u002BB4WdW5mUpJzexRlKmP0C1QEmXneDFbO2G0grhu4w=","VbxE6SYbM1pJW04yq\u002Bfq4M8OBlK1C2/Axp7HGmyEC6E=","NDZNIRTBPbDa13RLQn5qeTYTKESU3SMcjVC\u002BA9F7qlg="],"CachedAssets":{},"CachedCopyCandidates":{}}

View File

@@ -1 +1 @@
{"GlobalPropertiesHash":"EHbx5ejyqDv8gH5NpOoZxRAV9glFiYxTGFnRTcGg8no=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["aDrxgmPzfmAYNrzynmphKXORQNARBvx3ZJm3IcIlVIA=","dFQa1Ee6LWN6QaEoa8lulEtbH6imVMCsVrPTv7uB7rA=","KAWcEu8sopHLr7dsoLsr\u002Bz7vrHN0YxMtmdfBYeH1kwI=","\u002Bjyo4JejKGZVNH7yAY1POV7dsMBGmszgVLUsVwm0S6Y=","EuerEavGnRoNMMU450G02s4QgrYiGKZsiuKOVP7kEc0="],"CachedAssets":{},"CachedCopyCandidates":{}}
{"GlobalPropertiesHash":"BfdHfTJ1ZLXND4Gm4lkRtokO7tG9qdxvlfpLGsYryFY=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["qgBHL5R0mKXCiq65NnDep\u002B28SIMEandMOx72nKFCKds=","CFcBWGOCg2CGlH8Oj1fZ3/w1ogRq/hhCDREdOMIEOHQ=","Hr\u002BB4WdW5mUpJzexRlKmP0C1QEmXneDFbO2G0grhu4w=","VbxE6SYbM1pJW04yq\u002Bfq4M8OBlK1C2/Axp7HGmyEC6E=","NDZNIRTBPbDa13RLQn5qeTYTKESU3SMcjVC\u002BA9F7qlg="],"CachedAssets":{},"CachedCopyCandidates":{}}

View File

@@ -1,24 +1,24 @@
{
"format": 1,
"restore": {
"D:\\Nextcloud\\Documents\\Open-Archival\\OpenArchival.DataAccess\\OpenArchival.DataAccess.csproj": {}
"C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.DataAccess\\OpenArchival.DataAccess.csproj": {}
},
"projects": {
"D:\\Nextcloud\\Documents\\Open-Archival\\OpenArchival.DataAccess\\OpenArchival.DataAccess.csproj": {
"C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.DataAccess\\OpenArchival.DataAccess.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "D:\\Nextcloud\\Documents\\Open-Archival\\OpenArchival.DataAccess\\OpenArchival.DataAccess.csproj",
"projectUniqueName": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.DataAccess\\OpenArchival.DataAccess.csproj",
"projectName": "OpenArchival.DataAccess",
"projectPath": "D:\\Nextcloud\\Documents\\Open-Archival\\OpenArchival.DataAccess\\OpenArchival.DataAccess.csproj",
"packagesPath": "C:\\Users\\Vincent Allen\\.nuget\\packages\\",
"outputPath": "D:\\Nextcloud\\Documents\\Open-Archival\\OpenArchival.DataAccess\\obj\\",
"projectPath": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.DataAccess\\OpenArchival.DataAccess.csproj",
"packagesPath": "C:\\Users\\vtall\\.nuget\\packages\\",
"outputPath": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.DataAccess\\obj\\",
"projectStyle": "PackageReference",
"fallbackFolders": [
"C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"
],
"configFilePaths": [
"D:\\Nextcloud\\Documents\\Open-Archival\\NuGet.Config",
"C:\\Users\\Vincent Allen\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\NuGet.Config",
"C:\\Users\\vtall\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
],

View File

@@ -5,12 +5,12 @@
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\Vincent Allen\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages</NuGetPackageFolders>
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\vtall\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages</NuGetPackageFolders>
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.14.1</NuGetToolVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<SourceRoot Include="C:\Users\Vincent Allen\.nuget\packages\" />
<SourceRoot Include="C:\Users\vtall\.nuget\packages\" />
<SourceRoot Include="C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages\" />
</ItemGroup>
<ImportGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
@@ -20,7 +20,7 @@
<Import Project="$(NuGetPackageRoot)entityframework\6.5.1\buildTransitive\net6.0\EntityFramework.props" Condition="Exists('$(NuGetPackageRoot)entityframework\6.5.1\buildTransitive\net6.0\EntityFramework.props')" />
</ImportGroup>
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<PkgMicrosoft_CodeAnalysis_Analyzers Condition=" '$(PkgMicrosoft_CodeAnalysis_Analyzers)' == '' ">C:\Users\Vincent Allen\.nuget\packages\microsoft.codeanalysis.analyzers\3.3.4</PkgMicrosoft_CodeAnalysis_Analyzers>
<PkgEntityFramework Condition=" '$(PkgEntityFramework)' == '' ">C:\Users\Vincent Allen\.nuget\packages\entityframework\6.5.1</PkgEntityFramework>
<PkgMicrosoft_CodeAnalysis_Analyzers Condition=" '$(PkgMicrosoft_CodeAnalysis_Analyzers)' == '' ">C:\Users\vtall\.nuget\packages\microsoft.codeanalysis.analyzers\3.3.4</PkgMicrosoft_CodeAnalysis_Analyzers>
<PkgEntityFramework Condition=" '$(PkgEntityFramework)' == '' ">C:\Users\vtall\.nuget\packages\entityframework\6.5.1</PkgEntityFramework>
</PropertyGroup>
</Project>

View File

@@ -15,7 +15,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("OpenArchival.DataAccess")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+77318e87d12fb2935cd521cd7ef445296c08f8af")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+781793a27f2e164808340b1adb5ce70e1800b187")]
[assembly: System.Reflection.AssemblyProductAttribute("OpenArchival.DataAccess")]
[assembly: System.Reflection.AssemblyTitleAttribute("OpenArchival.DataAccess")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]

View File

@@ -1 +1 @@
cc950e208738c8967b3f3df0fc70fe22c92049085b0d068f4b8de0841ba74fd2
0157f894327ee0804b572c5a6532673bcdf2ccf9dc704f130e15e50822efddc9

View File

@@ -17,13 +17,13 @@ build_property._SupportedPlatformList = Linux,macOS,Windows
build_property._SupportedPlatformList = Linux,macOS,Windows
build_property.RootNamespace = OpenArchival.DataAccess
build_property.RootNamespace = OpenArchival.DataAccess
build_property.ProjectDir = D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess\
build_property.ProjectDir = C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess\
build_property.EnableComHosting =
build_property.EnableGeneratedComInterfaceComImportInterop =
build_property.RazorLangVersion = 9.0
build_property.SupportLocalizedComponentNames =
build_property.GenerateRazorMetadataSourceChecksumAttributes =
build_property.MSBuildProjectDirectory = D:\Nextcloud\Documents\Open-Archival\OpenArchival.DataAccess
build_property.MSBuildProjectDirectory = C:\Users\vtall\source\repos\vtallen\Open-Archival\OpenArchival.DataAccess
build_property._RazorSourceGeneratorDebug =
build_property.EffectiveAnalysisLevelStyle = 9.0
build_property.EnableCodeStyleSeverity =

View File

@@ -3962,24 +3962,24 @@
]
},
"packageFolders": {
"C:\\Users\\Vincent Allen\\.nuget\\packages\\": {},
"C:\\Users\\vtall\\.nuget\\packages\\": {},
"C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages": {}
},
"project": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "D:\\Nextcloud\\Documents\\Open-Archival\\OpenArchival.DataAccess\\OpenArchival.DataAccess.csproj",
"projectUniqueName": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.DataAccess\\OpenArchival.DataAccess.csproj",
"projectName": "OpenArchival.DataAccess",
"projectPath": "D:\\Nextcloud\\Documents\\Open-Archival\\OpenArchival.DataAccess\\OpenArchival.DataAccess.csproj",
"packagesPath": "C:\\Users\\Vincent Allen\\.nuget\\packages\\",
"outputPath": "D:\\Nextcloud\\Documents\\Open-Archival\\OpenArchival.DataAccess\\obj\\",
"projectPath": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.DataAccess\\OpenArchival.DataAccess.csproj",
"packagesPath": "C:\\Users\\vtall\\.nuget\\packages\\",
"outputPath": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.DataAccess\\obj\\",
"projectStyle": "PackageReference",
"fallbackFolders": [
"C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"
],
"configFilePaths": [
"D:\\Nextcloud\\Documents\\Open-Archival\\NuGet.Config",
"C:\\Users\\Vincent Allen\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\NuGet.Config",
"C:\\Users\\vtall\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
],

View File

@@ -1,72 +1,72 @@
{
"version": 2,
"dgSpecHash": "hp7Zw2nnSf0=",
"dgSpecHash": "9ogva5y/IuM=",
"success": true,
"projectFilePath": "D:\\Nextcloud\\Documents\\Open-Archival\\OpenArchival.DataAccess\\OpenArchival.DataAccess.csproj",
"projectFilePath": "C:\\Users\\vtall\\source\\repos\\vtallen\\Open-Archival\\OpenArchival.DataAccess\\OpenArchival.DataAccess.csproj",
"expectedPackageFiles": [
"C:\\Users\\Vincent Allen\\.nuget\\packages\\entityframework\\6.5.1\\entityframework.6.5.1.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\humanizer.core\\2.14.1\\humanizer.core.2.14.1.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\microsoft.aspnetcore.cryptography.internal\\9.0.8\\microsoft.aspnetcore.cryptography.internal.9.0.8.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\microsoft.aspnetcore.cryptography.keyderivation\\9.0.8\\microsoft.aspnetcore.cryptography.keyderivation.9.0.8.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\microsoft.aspnetcore.identity.entityframeworkcore\\9.0.8\\microsoft.aspnetcore.identity.entityframeworkcore.9.0.8.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\microsoft.bcl.asyncinterfaces\\7.0.0\\microsoft.bcl.asyncinterfaces.7.0.0.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\microsoft.build.framework\\17.8.3\\microsoft.build.framework.17.8.3.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\microsoft.build.locator\\1.7.8\\microsoft.build.locator.1.7.8.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\microsoft.codeanalysis.analyzers\\3.3.4\\microsoft.codeanalysis.analyzers.3.3.4.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\microsoft.codeanalysis.common\\4.8.0\\microsoft.codeanalysis.common.4.8.0.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\microsoft.codeanalysis.csharp\\4.8.0\\microsoft.codeanalysis.csharp.4.8.0.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\microsoft.codeanalysis.csharp.workspaces\\4.8.0\\microsoft.codeanalysis.csharp.workspaces.4.8.0.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\microsoft.codeanalysis.workspaces.common\\4.8.0\\microsoft.codeanalysis.workspaces.common.4.8.0.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\microsoft.codeanalysis.workspaces.msbuild\\4.8.0\\microsoft.codeanalysis.workspaces.msbuild.4.8.0.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\microsoft.csharp\\4.7.0\\microsoft.csharp.4.7.0.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\microsoft.entityframeworkcore\\9.0.8\\microsoft.entityframeworkcore.9.0.8.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\microsoft.entityframeworkcore.abstractions\\9.0.8\\microsoft.entityframeworkcore.abstractions.9.0.8.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\microsoft.entityframeworkcore.analyzers\\9.0.8\\microsoft.entityframeworkcore.analyzers.9.0.8.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\microsoft.entityframeworkcore.design\\9.0.8\\microsoft.entityframeworkcore.design.9.0.8.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\microsoft.entityframeworkcore.relational\\9.0.8\\microsoft.entityframeworkcore.relational.9.0.8.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\microsoft.extensions.caching.abstractions\\9.0.8\\microsoft.extensions.caching.abstractions.9.0.8.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\microsoft.extensions.caching.memory\\9.0.8\\microsoft.extensions.caching.memory.9.0.8.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\microsoft.extensions.configuration.abstractions\\9.0.8\\microsoft.extensions.configuration.abstractions.9.0.8.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\microsoft.extensions.dependencyinjection\\9.0.8\\microsoft.extensions.dependencyinjection.9.0.8.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\microsoft.extensions.dependencyinjection.abstractions\\9.0.8\\microsoft.extensions.dependencyinjection.abstractions.9.0.8.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\microsoft.extensions.dependencymodel\\9.0.8\\microsoft.extensions.dependencymodel.9.0.8.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\microsoft.extensions.identity.core\\9.0.8\\microsoft.extensions.identity.core.9.0.8.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\microsoft.extensions.identity.stores\\9.0.8\\microsoft.extensions.identity.stores.9.0.8.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\microsoft.extensions.logging\\9.0.8\\microsoft.extensions.logging.9.0.8.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\microsoft.extensions.logging.abstractions\\9.0.8\\microsoft.extensions.logging.abstractions.9.0.8.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\microsoft.extensions.options\\9.0.8\\microsoft.extensions.options.9.0.8.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\microsoft.extensions.primitives\\9.0.8\\microsoft.extensions.primitives.9.0.8.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\microsoft.win32.registry\\4.7.0\\microsoft.win32.registry.4.7.0.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\microsoft.win32.systemevents\\6.0.0\\microsoft.win32.systemevents.6.0.0.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\mono.texttemplating\\3.0.0\\mono.texttemplating.3.0.0.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\npgsql\\9.0.3\\npgsql.9.0.3.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\npgsql.entityframeworkcore.postgresql\\9.0.4\\npgsql.entityframeworkcore.postgresql.9.0.4.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\runtime.native.system.data.sqlclient.sni\\4.7.0\\runtime.native.system.data.sqlclient.sni.4.7.0.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\runtime.win-arm64.runtime.native.system.data.sqlclient.sni\\4.4.0\\runtime.win-arm64.runtime.native.system.data.sqlclient.sni.4.4.0.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\runtime.win-x64.runtime.native.system.data.sqlclient.sni\\4.4.0\\runtime.win-x64.runtime.native.system.data.sqlclient.sni.4.4.0.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\runtime.win-x86.runtime.native.system.data.sqlclient.sni\\4.4.0\\runtime.win-x86.runtime.native.system.data.sqlclient.sni.4.4.0.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\system.codedom\\6.0.0\\system.codedom.6.0.0.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\system.collections.immutable\\7.0.0\\system.collections.immutable.7.0.0.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\system.componentmodel.annotations\\5.0.0\\system.componentmodel.annotations.5.0.0.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\system.composition\\7.0.0\\system.composition.7.0.0.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\system.composition.attributedmodel\\7.0.0\\system.composition.attributedmodel.7.0.0.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\system.composition.convention\\7.0.0\\system.composition.convention.7.0.0.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\system.composition.hosting\\7.0.0\\system.composition.hosting.7.0.0.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\system.composition.runtime\\7.0.0\\system.composition.runtime.7.0.0.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\system.composition.typedparts\\7.0.0\\system.composition.typedparts.7.0.0.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\system.configuration.configurationmanager\\6.0.1\\system.configuration.configurationmanager.6.0.1.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\system.data.sqlclient\\4.8.6\\system.data.sqlclient.4.8.6.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\system.drawing.common\\6.0.0\\system.drawing.common.6.0.0.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\system.io.pipelines\\7.0.0\\system.io.pipelines.7.0.0.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\system.reflection.metadata\\7.0.0\\system.reflection.metadata.7.0.0.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\system.runtime.compilerservices.unsafe\\6.0.0\\system.runtime.compilerservices.unsafe.6.0.0.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\system.security.accesscontrol\\6.0.0\\system.security.accesscontrol.6.0.0.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\system.security.cryptography.protecteddata\\6.0.0\\system.security.cryptography.protecteddata.6.0.0.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\system.security.permissions\\6.0.0\\system.security.permissions.6.0.0.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\system.security.principal.windows\\4.7.0\\system.security.principal.windows.4.7.0.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\system.text.json\\9.0.8\\system.text.json.9.0.8.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\system.threading.channels\\7.0.0\\system.threading.channels.7.0.0.nupkg.sha512",
"C:\\Users\\Vincent Allen\\.nuget\\packages\\system.windows.extensions\\6.0.0\\system.windows.extensions.6.0.0.nupkg.sha512"
"C:\\Users\\vtall\\.nuget\\packages\\entityframework\\6.5.1\\entityframework.6.5.1.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\humanizer.core\\2.14.1\\humanizer.core.2.14.1.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.aspnetcore.cryptography.internal\\9.0.8\\microsoft.aspnetcore.cryptography.internal.9.0.8.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.aspnetcore.cryptography.keyderivation\\9.0.8\\microsoft.aspnetcore.cryptography.keyderivation.9.0.8.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.aspnetcore.identity.entityframeworkcore\\9.0.8\\microsoft.aspnetcore.identity.entityframeworkcore.9.0.8.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.bcl.asyncinterfaces\\7.0.0\\microsoft.bcl.asyncinterfaces.7.0.0.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.build.framework\\17.8.3\\microsoft.build.framework.17.8.3.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.build.locator\\1.7.8\\microsoft.build.locator.1.7.8.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.codeanalysis.analyzers\\3.3.4\\microsoft.codeanalysis.analyzers.3.3.4.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.codeanalysis.common\\4.8.0\\microsoft.codeanalysis.common.4.8.0.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.codeanalysis.csharp\\4.8.0\\microsoft.codeanalysis.csharp.4.8.0.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.codeanalysis.csharp.workspaces\\4.8.0\\microsoft.codeanalysis.csharp.workspaces.4.8.0.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.codeanalysis.workspaces.common\\4.8.0\\microsoft.codeanalysis.workspaces.common.4.8.0.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.codeanalysis.workspaces.msbuild\\4.8.0\\microsoft.codeanalysis.workspaces.msbuild.4.8.0.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.csharp\\4.7.0\\microsoft.csharp.4.7.0.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.entityframeworkcore\\9.0.8\\microsoft.entityframeworkcore.9.0.8.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.entityframeworkcore.abstractions\\9.0.8\\microsoft.entityframeworkcore.abstractions.9.0.8.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.entityframeworkcore.analyzers\\9.0.8\\microsoft.entityframeworkcore.analyzers.9.0.8.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.entityframeworkcore.design\\9.0.8\\microsoft.entityframeworkcore.design.9.0.8.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.entityframeworkcore.relational\\9.0.8\\microsoft.entityframeworkcore.relational.9.0.8.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.extensions.caching.abstractions\\9.0.8\\microsoft.extensions.caching.abstractions.9.0.8.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.extensions.caching.memory\\9.0.8\\microsoft.extensions.caching.memory.9.0.8.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.extensions.configuration.abstractions\\9.0.8\\microsoft.extensions.configuration.abstractions.9.0.8.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.extensions.dependencyinjection\\9.0.8\\microsoft.extensions.dependencyinjection.9.0.8.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.extensions.dependencyinjection.abstractions\\9.0.8\\microsoft.extensions.dependencyinjection.abstractions.9.0.8.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.extensions.dependencymodel\\9.0.8\\microsoft.extensions.dependencymodel.9.0.8.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.extensions.identity.core\\9.0.8\\microsoft.extensions.identity.core.9.0.8.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.extensions.identity.stores\\9.0.8\\microsoft.extensions.identity.stores.9.0.8.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.extensions.logging\\9.0.8\\microsoft.extensions.logging.9.0.8.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.extensions.logging.abstractions\\9.0.8\\microsoft.extensions.logging.abstractions.9.0.8.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.extensions.options\\9.0.8\\microsoft.extensions.options.9.0.8.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.extensions.primitives\\9.0.8\\microsoft.extensions.primitives.9.0.8.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.win32.registry\\4.7.0\\microsoft.win32.registry.4.7.0.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\microsoft.win32.systemevents\\6.0.0\\microsoft.win32.systemevents.6.0.0.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\mono.texttemplating\\3.0.0\\mono.texttemplating.3.0.0.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\npgsql\\9.0.3\\npgsql.9.0.3.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\npgsql.entityframeworkcore.postgresql\\9.0.4\\npgsql.entityframeworkcore.postgresql.9.0.4.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\runtime.native.system.data.sqlclient.sni\\4.7.0\\runtime.native.system.data.sqlclient.sni.4.7.0.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\runtime.win-arm64.runtime.native.system.data.sqlclient.sni\\4.4.0\\runtime.win-arm64.runtime.native.system.data.sqlclient.sni.4.4.0.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\runtime.win-x64.runtime.native.system.data.sqlclient.sni\\4.4.0\\runtime.win-x64.runtime.native.system.data.sqlclient.sni.4.4.0.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\runtime.win-x86.runtime.native.system.data.sqlclient.sni\\4.4.0\\runtime.win-x86.runtime.native.system.data.sqlclient.sni.4.4.0.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\system.codedom\\6.0.0\\system.codedom.6.0.0.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\system.collections.immutable\\7.0.0\\system.collections.immutable.7.0.0.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\system.componentmodel.annotations\\5.0.0\\system.componentmodel.annotations.5.0.0.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\system.composition\\7.0.0\\system.composition.7.0.0.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\system.composition.attributedmodel\\7.0.0\\system.composition.attributedmodel.7.0.0.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\system.composition.convention\\7.0.0\\system.composition.convention.7.0.0.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\system.composition.hosting\\7.0.0\\system.composition.hosting.7.0.0.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\system.composition.runtime\\7.0.0\\system.composition.runtime.7.0.0.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\system.composition.typedparts\\7.0.0\\system.composition.typedparts.7.0.0.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\system.configuration.configurationmanager\\6.0.1\\system.configuration.configurationmanager.6.0.1.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\system.data.sqlclient\\4.8.6\\system.data.sqlclient.4.8.6.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\system.drawing.common\\6.0.0\\system.drawing.common.6.0.0.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\system.io.pipelines\\7.0.0\\system.io.pipelines.7.0.0.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\system.reflection.metadata\\7.0.0\\system.reflection.metadata.7.0.0.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\system.runtime.compilerservices.unsafe\\6.0.0\\system.runtime.compilerservices.unsafe.6.0.0.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\system.security.accesscontrol\\6.0.0\\system.security.accesscontrol.6.0.0.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\system.security.cryptography.protecteddata\\6.0.0\\system.security.cryptography.protecteddata.6.0.0.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\system.security.permissions\\6.0.0\\system.security.permissions.6.0.0.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\system.security.principal.windows\\4.7.0\\system.security.principal.windows.4.7.0.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\system.text.json\\9.0.8\\system.text.json.9.0.8.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\system.threading.channels\\7.0.0\\system.threading.channels.7.0.0.nupkg.sha512",
"C:\\Users\\vtall\\.nuget\\packages\\system.windows.extensions\\6.0.0\\system.windows.extensions.6.0.0.nupkg.sha512"
],
"logs": []
}