Bifrost/src/Bifrost.Web/Data/BifrostDbContext.cs

600 lines
27 KiB
C#

using Bifrost.Web.Domain;
using Microsoft.EntityFrameworkCore;
namespace Bifrost.Web.Data;
public sealed class BifrostDbContext(DbContextOptions<BifrostDbContext> options) : DbContext(options)
{
// The OpenIddict tables are part of this model for every way a context is built: the host, the concepts
// command, tests and the design-time factory that generates migrations.
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) => optionsBuilder.UseOpenIddict();
public DbSet<UserAccount> UserAccounts => Set<UserAccount>();
public DbSet<MemberProfile> MemberProfiles => Set<MemberProfile>();
public DbSet<Membership> Memberships => Set<Membership>();
public DbSet<RoleAssignment> RoleAssignments => Set<RoleAssignment>();
public DbSet<TierSnapshot> TierSnapshots => Set<TierSnapshot>();
public DbSet<MembershipInvitation> MembershipInvitations => Set<MembershipInvitation>();
public DbSet<Project> Projects => Set<Project>();
public DbSet<WorkItem> WorkItems => Set<WorkItem>();
public DbSet<VolunteerClaim> VolunteerClaims => Set<VolunteerClaim>();
public DbSet<Assignment> Assignments => Set<Assignment>();
public DbSet<WorkLog> WorkLogs => Set<WorkLog>();
public DbSet<WorkReview> WorkReviews => Set<WorkReview>();
public DbSet<GitHubIssueLink> GitHubIssueLinks => Set<GitHubIssueLink>();
public DbSet<GitHubPullRequestLink> GitHubPullRequestLinks => Set<GitHubPullRequestLink>();
public DbSet<Motion> Motions => Set<Motion>();
public DbSet<Vote> Votes => Set<Vote>();
public DbSet<SealedBallot> SealedBallots => Set<SealedBallot>();
public DbSet<MindKey> MindKeys => Set<MindKey>();
public DbSet<MindNonce> MindNonces => Set<MindNonce>();
public DbSet<MindPersona> MindPersonas => Set<MindPersona>();
public DbSet<LedgerEntry> LedgerEntries => Set<LedgerEntry>();
public DbSet<PayoutProposalBatch> PayoutProposalBatches => Set<PayoutProposalBatch>();
public DbSet<PointTransaction> PointTransactions => Set<PointTransaction>();
public DbSet<PatronSupportEvent> PatronSupportEvents => Set<PatronSupportEvent>();
public DbSet<DecayRun> DecayRuns => Set<DecayRun>();
public DbSet<RevenueEvent> RevenueEvents => Set<RevenueEvent>();
public DbSet<RevenueShareBatch> RevenueShareBatches => Set<RevenueShareBatch>();
public DbSet<RevenueShareLine> RevenueShareLines => Set<RevenueShareLine>();
public DbSet<BridgeAction> BridgeActions => Set<BridgeAction>();
public DbSet<AgentDispatchRun> AgentDispatchRuns => Set<AgentDispatchRun>();
public DbSet<AgentTransportReceipt> AgentTransportReceipts => Set<AgentTransportReceipt>();
public DbSet<GovernanceActivityReceipt> GovernanceActivityReceipts => Set<GovernanceActivityReceipt>();
public DbSet<AuditEvent> AuditEvents => Set<AuditEvent>();
public DbSet<ConceptSubject> ConceptSubjects => Set<ConceptSubject>();
public DbSet<ConceptAppraisal> ConceptAppraisals => Set<ConceptAppraisal>();
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<UserAccount>(entity =>
{
entity.HasIndex(x => x.NormalizedBifrostIdentity).IsUnique().HasFilter("\"NormalizedBifrostIdentity\" <> ''");
entity.HasIndex(x => x.GitHubUserId).IsUnique().HasFilter("\"GitHubUserId\" IS NOT NULL");
entity.HasIndex(x => x.HeimdallAccountId).IsUnique().HasFilter("\"HeimdallAccountId\" <> ''");
entity.HasIndex(x => x.NormalizedGitHubLogin).IsUnique().HasFilter("\"NormalizedGitHubLogin\" <> ''");
entity.Property(x => x.BifrostIdentity).HasMaxLength(120);
entity.Property(x => x.NormalizedBifrostIdentity).HasMaxLength(120);
entity.Property(x => x.HeimdallAccountId).HasMaxLength(160);
entity.Property(x => x.GitHubLogin).HasMaxLength(120);
entity.Property(x => x.NormalizedGitHubLogin).HasMaxLength(120);
entity.Property(x => x.DisplayName).HasMaxLength(200);
entity.Property(x => x.AvatarUrl).HasMaxLength(500);
});
modelBuilder.Entity<MemberProfile>(entity =>
{
entity.HasOne(x => x.UserAccount)
.WithOne(x => x.MemberProfile)
.HasForeignKey<MemberProfile>(x => x.UserAccountId);
entity.Property(x => x.Nickname).HasMaxLength(120);
entity.Property(x => x.Headline).HasMaxLength(240);
entity.Property(x => x.PortfolioUrl).HasMaxLength(500);
});
modelBuilder.Entity<Membership>(entity =>
{
entity.HasOne(x => x.UserAccount)
.WithOne(x => x.Membership)
.HasForeignKey<Membership>(x => x.UserAccountId);
entity.Property(x => x.Status).HasConversion<string>();
});
modelBuilder.Entity<RoleAssignment>(entity =>
{
entity.HasIndex(x => new { x.MembershipId, x.Role }).IsUnique();
entity.Property(x => x.Role).HasConversion<string>();
entity.HasOne(x => x.Membership)
.WithMany(x => x.RoleAssignments)
.HasForeignKey(x => x.MembershipId);
entity.HasOne(x => x.AssignedByUserAccount)
.WithMany()
.HasForeignKey(x => x.AssignedByUserAccountId)
.OnDelete(DeleteBehavior.SetNull);
});
modelBuilder.Entity<TierSnapshot>(entity =>
{
entity.Property(x => x.Kind).HasConversion<string>();
entity.Property(x => x.Label).HasMaxLength(120);
entity.Property(x => x.Weight).HasPrecision(18, 2);
entity.HasIndex(x => new { x.MembershipId, x.Kind, x.IsCurrent });
entity.HasOne(x => x.Membership)
.WithMany(x => x.TierSnapshots)
.HasForeignKey(x => x.MembershipId);
});
modelBuilder.Entity<MembershipInvitation>(entity =>
{
entity.HasIndex(x => x.NormalizedGitHubLogin).IsUnique();
entity.Property(x => x.GitHubLogin).HasMaxLength(120);
entity.Property(x => x.NormalizedGitHubLogin).HasMaxLength(120);
entity.HasOne(x => x.IssuedByUserAccount)
.WithMany()
.HasForeignKey(x => x.IssuedByUserAccountId)
.OnDelete(DeleteBehavior.SetNull);
entity.HasOne(x => x.AcceptedByUserAccount)
.WithMany()
.HasForeignKey(x => x.AcceptedByUserAccountId)
.OnDelete(DeleteBehavior.SetNull);
});
modelBuilder.Entity<Project>(entity =>
{
entity.HasIndex(x => x.Slug).IsUnique();
entity.HasIndex(x => x.GitHubRepository);
entity.Property(x => x.Name).HasMaxLength(180);
entity.Property(x => x.Slug).HasMaxLength(120);
entity.Property(x => x.GitHubRepository).HasMaxLength(240);
entity.Property(x => x.Status).HasConversion<string>();
entity.HasOne(x => x.OwnerUserAccount)
.WithMany(x => x.OwnedProjects)
.HasForeignKey(x => x.OwnerUserAccountId)
.OnDelete(DeleteBehavior.Restrict);
});
modelBuilder.Entity<WorkItem>(entity =>
{
entity.Property(x => x.SourceType).HasConversion<string>();
entity.Property(x => x.Status).HasConversion<string>();
entity.Property(x => x.ReviewStatus).HasConversion<string>();
entity.Property(x => x.SkillLevel).HasConversion<string>();
entity.Property(x => x.Title).HasMaxLength(180);
entity.Property(x => x.Category).HasMaxLength(120);
entity.Property(x => x.ExternalSourceId).HasMaxLength(240);
entity.Property(x => x.EstimatedHours).HasPrecision(18, 2);
entity.Property(x => x.ContributionPoints).HasPrecision(18, 2);
entity.HasOne(x => x.Project)
.WithMany(x => x.WorkItems)
.HasForeignKey(x => x.ProjectId);
entity.HasOne(x => x.RequestedByUserAccount)
.WithMany(x => x.RequestedWorkItems)
.HasForeignKey(x => x.RequestedByUserAccountId)
.OnDelete(DeleteBehavior.Restrict);
entity.HasOne(x => x.AssignedToUserAccount)
.WithMany(x => x.AssignedWorkItems)
.HasForeignKey(x => x.AssignedToUserAccountId)
.OnDelete(DeleteBehavior.SetNull);
});
modelBuilder.Entity<VolunteerClaim>(entity =>
{
entity.HasIndex(x => new { x.WorkItemId, x.UserAccountId }).IsUnique();
entity.Property(x => x.Status).HasConversion<string>();
entity.HasOne(x => x.WorkItem)
.WithMany(x => x.VolunteerClaims)
.HasForeignKey(x => x.WorkItemId);
entity.HasOne(x => x.UserAccount)
.WithMany(x => x.VolunteerClaims)
.HasForeignKey(x => x.UserAccountId)
.OnDelete(DeleteBehavior.Restrict);
});
modelBuilder.Entity<Assignment>(entity =>
{
entity.HasOne(x => x.WorkItem)
.WithMany(x => x.Assignments)
.HasForeignKey(x => x.WorkItemId);
entity.HasOne(x => x.UserAccount)
.WithMany(x => x.Assignments)
.HasForeignKey(x => x.UserAccountId)
.OnDelete(DeleteBehavior.Restrict);
entity.HasOne(x => x.AssignedByUserAccount)
.WithMany()
.HasForeignKey(x => x.AssignedByUserAccountId)
.OnDelete(DeleteBehavior.Restrict);
});
modelBuilder.Entity<WorkLog>(entity =>
{
entity.Property(x => x.Hours).HasPrecision(18, 2);
entity.Property(x => x.ApprovalStatus).HasConversion<string>();
entity.HasOne(x => x.WorkItem)
.WithMany(x => x.WorkLogs)
.HasForeignKey(x => x.WorkItemId);
entity.HasOne(x => x.UserAccount)
.WithMany(x => x.WorkLogs)
.HasForeignKey(x => x.UserAccountId)
.OnDelete(DeleteBehavior.Restrict);
entity.HasOne(x => x.ReviewedByUserAccount)
.WithMany()
.HasForeignKey(x => x.ReviewedByUserAccountId)
.OnDelete(DeleteBehavior.SetNull);
});
modelBuilder.Entity<WorkReview>(entity =>
{
entity.Property(x => x.Status).HasConversion<string>();
entity.Property(x => x.ReviewerName).HasMaxLength(200);
entity.HasOne(x => x.WorkItem)
.WithMany(x => x.WorkReviews)
.HasForeignKey(x => x.WorkItemId);
entity.HasOne(x => x.ReviewerUserAccount)
.WithMany(x => x.WorkReviews)
.HasForeignKey(x => x.ReviewerUserAccountId)
.OnDelete(DeleteBehavior.SetNull);
});
modelBuilder.Entity<GitHubIssueLink>(entity =>
{
entity.HasIndex(x => x.WorkItemId).IsUnique();
entity.HasIndex(x => new { x.RepositoryFullName, x.IssueNumber }).IsUnique();
entity.Property(x => x.RepositoryFullName).HasMaxLength(240);
entity.Property(x => x.State).HasConversion<string>();
entity.Property(x => x.IssueUrl).HasMaxLength(500);
entity.Property(x => x.TitleSnapshot).HasMaxLength(240);
entity.HasOne(x => x.WorkItem)
.WithOne(x => x.GitHubIssueLink)
.HasForeignKey<GitHubIssueLink>(x => x.WorkItemId);
});
modelBuilder.Entity<GitHubPullRequestLink>(entity =>
{
entity.HasIndex(x => new { x.RepositoryFullName, x.PullRequestNumber }).IsUnique();
entity.Property(x => x.RepositoryFullName).HasMaxLength(240);
entity.Property(x => x.State).HasConversion<string>();
entity.Property(x => x.ReviewDecision).HasConversion<string>();
entity.Property(x => x.PullRequestUrl).HasMaxLength(500);
entity.Property(x => x.TitleSnapshot).HasMaxLength(240);
entity.HasOne(x => x.WorkItem)
.WithMany(x => x.GitHubPullRequestLinks)
.HasForeignKey(x => x.WorkItemId);
});
modelBuilder.Entity<Motion>(entity =>
{
entity.Property(x => x.Scope).HasConversion<string>();
entity.Property(x => x.Category).HasConversion<string>();
entity.Property(x => x.Status).HasConversion<string>();
entity.Property(x => x.ApprovalThreshold).HasPrecision(6, 3);
entity.Property(x => x.Kind).HasConversion<string>();
entity.Property(x => x.RevealSeq).IsConcurrencyToken();
entity.Property(x => x.Status).IsConcurrencyToken();
entity.HasOne(x => x.Project)
.WithMany(x => x.Motions)
.HasForeignKey(x => x.ProjectId)
.OnDelete(DeleteBehavior.SetNull);
entity.HasOne(x => x.CreatedByUserAccount)
.WithMany(x => x.CreatedMotions)
.HasForeignKey(x => x.CreatedByUserAccountId)
.OnDelete(DeleteBehavior.Restrict);
});
modelBuilder.Entity<Vote>(entity =>
{
entity.HasIndex(x => new { x.MotionId, x.UserAccountId }).IsUnique();
entity.Property(x => x.Choice).HasConversion<string>();
entity.Property(x => x.Weight).HasPrecision(18, 2);
entity.HasOne(x => x.Motion)
.WithMany(x => x.Votes)
.HasForeignKey(x => x.MotionId);
entity.HasOne(x => x.UserAccount)
.WithMany(x => x.Votes)
.HasForeignKey(x => x.UserAccountId)
.OnDelete(DeleteBehavior.Restrict);
});
modelBuilder.Entity<SealedBallot>(entity =>
{
entity.HasIndex(x => new { x.MotionId, x.UserAccountId }).IsUnique();
entity.HasOne(x => x.Motion)
.WithMany(x => x.SealedBallots)
.HasForeignKey(x => x.MotionId);
entity.HasOne(x => x.UserAccount)
.WithMany()
.HasForeignKey(x => x.UserAccountId)
.OnDelete(DeleteBehavior.Restrict);
});
modelBuilder.Entity<MindKey>(entity =>
{
entity.HasIndex(x => new { x.PersonaId, x.PublicKey }).IsUnique();
});
modelBuilder.Entity<MindPersona>(entity =>
{
entity.HasIndex(x => x.PersonaId).IsUnique();
entity.HasIndex(x => x.UserAccountId).IsUnique();
});
modelBuilder.Entity<MindNonce>(entity =>
{
entity.HasIndex(x => new { x.PersonaId, x.Nonce }).IsUnique();
});
modelBuilder.Entity<LedgerEntry>(entity =>
{
entity.Property(x => x.EntryType).HasConversion<string>();
entity.Property(x => x.Status).HasConversion<string>();
entity.Property(x => x.Points).HasPrecision(18, 2);
entity.Property(x => x.NominalAmount).HasPrecision(18, 2);
entity.HasOne(x => x.UserAccount)
.WithMany(x => x.LedgerEntries)
.HasForeignKey(x => x.UserAccountId)
.OnDelete(DeleteBehavior.Restrict);
entity.HasOne(x => x.CreatedByUserAccount)
.WithMany()
.HasForeignKey(x => x.CreatedByUserAccountId)
.OnDelete(DeleteBehavior.Restrict);
entity.HasOne(x => x.Project)
.WithMany(x => x.LedgerEntries)
.HasForeignKey(x => x.ProjectId)
.OnDelete(DeleteBehavior.SetNull);
entity.HasOne(x => x.WorkItem)
.WithMany(x => x.LedgerEntries)
.HasForeignKey(x => x.WorkItemId)
.OnDelete(DeleteBehavior.SetNull);
});
modelBuilder.Entity<PayoutProposalBatch>(entity =>
{
entity.Property(x => x.Status).HasConversion<string>();
entity.HasOne(x => x.CreatedByUserAccount)
.WithMany()
.HasForeignKey(x => x.CreatedByUserAccountId)
.OnDelete(DeleteBehavior.Restrict);
});
modelBuilder.Entity<PointTransaction>(entity =>
{
entity.Property(x => x.Type).HasConversion<string>();
entity.Property(x => x.Amount).HasPrecision(18, 2);
entity.HasOne(x => x.UserAccount)
.WithMany(x => x.PointTransactions)
.HasForeignKey(x => x.UserAccountId)
.OnDelete(DeleteBehavior.Restrict);
entity.HasOne(x => x.Project)
.WithMany(x => x.PointTransactions)
.HasForeignKey(x => x.ProjectId)
.OnDelete(DeleteBehavior.SetNull);
entity.HasOne(x => x.WorkItem)
.WithMany(x => x.PointTransactions)
.HasForeignKey(x => x.WorkItemId)
.OnDelete(DeleteBehavior.SetNull);
});
modelBuilder.Entity<PatronSupportEvent>(entity =>
{
entity.Property(x => x.Kind).HasConversion<string>();
entity.Property(x => x.Provider).HasConversion<string>();
entity.Property(x => x.Amount).HasPrecision(18, 2);
entity.Property(x => x.ExternalSupportId).HasMaxLength(240);
entity.Property(x => x.ProviderEventId).HasMaxLength(240);
entity.Property(x => x.ProviderPayerId).HasMaxLength(240);
entity.Property(x => x.ProviderSubscriptionId).HasMaxLength(240);
entity.Property(x => x.CurrencyCode).HasMaxLength(12);
entity.HasIndex(x => new { x.UserAccountId, x.Kind, x.IsCurrentRecurringSupport });
entity.HasIndex(x => new { x.Provider, x.ProviderEventId })
.IsUnique()
.HasFilter("\"ProviderEventId\" <> ''");
entity.HasOne(x => x.UserAccount)
.WithMany(x => x.PatronSupportEvents)
.HasForeignKey(x => x.UserAccountId)
.OnDelete(DeleteBehavior.Restrict);
entity.HasOne(x => x.Project)
.WithMany(x => x.PatronSupportEvents)
.HasForeignKey(x => x.ProjectId)
.OnDelete(DeleteBehavior.SetNull);
});
modelBuilder.Entity<DecayRun>(entity =>
{
entity.Property(x => x.Rate).HasPrecision(8, 4);
});
modelBuilder.Entity<RevenueEvent>(entity =>
{
entity.Property(x => x.Amount).HasPrecision(18, 2);
entity.Property(x => x.CurrencyCode).HasMaxLength(12);
entity.HasOne(x => x.Project)
.WithMany(x => x.RevenueEvents)
.HasForeignKey(x => x.ProjectId)
.OnDelete(DeleteBehavior.SetNull);
});
modelBuilder.Entity<RevenueShareBatch>(entity =>
{
entity.HasOne(x => x.RevenueEvent)
.WithMany(x => x.RevenueShareBatches)
.HasForeignKey(x => x.RevenueEventId)
.OnDelete(DeleteBehavior.SetNull);
entity.HasOne(x => x.CreatedByUserAccount)
.WithMany()
.HasForeignKey(x => x.CreatedByUserAccountId)
.OnDelete(DeleteBehavior.Restrict);
});
modelBuilder.Entity<RevenueShareLine>(entity =>
{
entity.Property(x => x.Amount).HasPrecision(18, 2);
entity.Property(x => x.Basis).HasMaxLength(240);
entity.HasOne(x => x.RevenueShareBatch)
.WithMany(x => x.Lines)
.HasForeignKey(x => x.RevenueShareBatchId);
entity.HasOne(x => x.UserAccount)
.WithMany()
.HasForeignKey(x => x.UserAccountId)
.OnDelete(DeleteBehavior.SetNull);
entity.HasOne(x => x.Project)
.WithMany(x => x.RevenueShareLines)
.HasForeignKey(x => x.ProjectId)
.OnDelete(DeleteBehavior.SetNull);
});
modelBuilder.Entity<BridgeAction>(entity =>
{
entity.Property(x => x.ActorKind).HasConversion<string>();
entity.Property(x => x.TargetSurface).HasConversion<string>();
entity.Property(x => x.ActionKind).HasConversion<string>();
entity.Property(x => x.Status).HasConversion<string>();
entity.Property(x => x.ActorName).HasMaxLength(160);
entity.Property(x => x.TargetRepositoryFullName).HasMaxLength(240);
entity.Property(x => x.TargetLocator).HasMaxLength(500);
entity.Property(x => x.TargetSurfaceName).HasMaxLength(120);
entity.Property(x => x.SourceKind).HasMaxLength(120);
entity.Property(x => x.SourceId).HasMaxLength(240);
entity.Property(x => x.AuthorityReference).HasMaxLength(240);
entity.Property(x => x.BifrostIdentity).HasMaxLength(160);
entity.Property(x => x.HeimdallCapabilityReference).HasMaxLength(240);
entity.Property(x => x.EpiphanyRunId).HasMaxLength(160);
entity.Property(x => x.EpiphanyLaneId).HasMaxLength(120);
entity.Property(x => x.EpiphanyAgentIdentity).HasMaxLength(160);
entity.Property(x => x.PolicyDecision).HasMaxLength(500);
entity.Property(x => x.Title).HasMaxLength(240);
entity.Property(x => x.ReceiptUrl).HasMaxLength(500);
entity.Property(x => x.ExternalReceiptId).HasMaxLength(240);
entity.HasIndex(x => x.Status);
entity.HasIndex(x => new { x.TargetSurface, x.ActionKind, x.Status });
entity.HasIndex(x => new { x.TargetSurface, x.TargetSurfaceName, x.Status });
entity.HasIndex(x => new { x.ActorKind, x.ActorName });
entity.HasIndex(x => new { x.SourceKind, x.SourceId });
entity.HasIndex(x => x.BifrostIdentity);
entity.HasIndex(x => x.HeimdallCapabilityReference);
entity.HasOne(x => x.ActorUserAccount)
.WithMany(x => x.BridgeActions)
.HasForeignKey(x => x.ActorUserAccountId)
.OnDelete(DeleteBehavior.SetNull);
entity.HasOne(x => x.WorkItem)
.WithMany()
.HasForeignKey(x => x.WorkItemId)
.OnDelete(DeleteBehavior.SetNull);
entity.HasOne(x => x.Motion)
.WithMany()
.HasForeignKey(x => x.MotionId)
.OnDelete(DeleteBehavior.SetNull);
});
modelBuilder.Entity<AgentDispatchRun>(entity =>
{
entity.Property(x => x.RequestId).HasMaxLength(240);
entity.Property(x => x.TargetRepoName).HasMaxLength(120);
entity.Property(x => x.TargetRepositoryFullName).HasMaxLength(240);
entity.Property(x => x.TargetAgentIdentity).HasMaxLength(160);
entity.Property(x => x.LaunchMode).HasMaxLength(40);
entity.Property(x => x.Status).HasConversion<string>();
entity.Property(x => x.ThreadId).HasMaxLength(120);
entity.Property(x => x.TurnId).HasMaxLength(120);
entity.Property(x => x.LogPath).HasMaxLength(500);
entity.Property(x => x.ResultPath).HasMaxLength(500);
entity.HasIndex(x => x.RequestId);
entity.HasIndex(x => x.Status);
entity.HasIndex(x => new { x.TargetRepoName, x.TargetAgentIdentity, x.Status });
entity.HasOne(x => x.StartedByUserAccount)
.WithMany(x => x.AgentDispatchRuns)
.HasForeignKey(x => x.StartedByUserAccountId)
.OnDelete(DeleteBehavior.SetNull);
});
modelBuilder.Entity<AgentTransportReceipt>(entity =>
{
entity.Property(x => x.RequestId).HasMaxLength(240);
entity.Property(x => x.Title).HasMaxLength(240);
entity.Property(x => x.TargetRepoName).HasMaxLength(120);
entity.Property(x => x.TargetRepositoryFullName).HasMaxLength(240);
entity.Property(x => x.TargetAgentIdentity).HasMaxLength(160);
entity.Property(x => x.ActivityKind).HasConversion<string>();
entity.Property(x => x.Status).HasMaxLength(40);
entity.Property(x => x.ActorName).HasMaxLength(160);
entity.HasIndex(x => x.RequestId);
entity.HasIndex(x => x.OccurredAtUtc);
entity.HasIndex(x => new { x.TargetRepoName, x.TargetAgentIdentity, x.ActivityKind });
entity.HasOne(x => x.ActorUserAccount)
.WithMany(x => x.AgentTransportReceipts)
.HasForeignKey(x => x.ActorUserAccountId)
.OnDelete(DeleteBehavior.SetNull);
});
modelBuilder.Entity<GovernanceActivityReceipt>(entity =>
{
entity.Property(x => x.TopicId).HasMaxLength(120);
entity.Property(x => x.CommentId).HasMaxLength(120);
entity.Property(x => x.DispatchRequestId).HasMaxLength(240);
entity.Property(x => x.Title).HasMaxLength(240);
entity.Property(x => x.JurisdictionRepoName).HasMaxLength(120);
entity.Property(x => x.JurisdictionAgentIdentity).HasMaxLength(160);
entity.Property(x => x.ActivityKind).HasConversion<string>();
entity.Property(x => x.ActorKind).HasMaxLength(40);
entity.Property(x => x.ActorName).HasMaxLength(160);
entity.HasIndex(x => x.TopicId);
entity.HasIndex(x => x.OccurredAtUtc);
entity.HasIndex(x => new { x.JurisdictionRepoName, x.JurisdictionAgentIdentity, x.ActivityKind });
entity.HasOne(x => x.ActorUserAccount)
.WithMany(x => x.GovernanceActivityReceipts)
.HasForeignKey(x => x.ActorUserAccountId)
.OnDelete(DeleteBehavior.SetNull);
});
modelBuilder.Entity<AuditEvent>(entity =>
{
entity.Property(x => x.EntityType).HasMaxLength(120);
entity.Property(x => x.EntityId).HasMaxLength(120);
entity.Property(x => x.Action).HasMaxLength(120);
entity.HasOne(x => x.ActorUserAccount)
.WithMany(x => x.AuditEvents)
.HasForeignKey(x => x.ActorUserAccountId)
.OnDelete(DeleteBehavior.SetNull);
});
modelBuilder.Entity<ConceptSubject>(entity =>
{
entity.Property(x => x.Collection).HasMaxLength(80);
entity.Property(x => x.Key).HasMaxLength(80);
entity.Property(x => x.Title).HasMaxLength(240);
entity.HasIndex(x => new { x.Collection, x.Key }).IsUnique();
});
modelBuilder.Entity<ConceptAppraisal>(entity =>
{
entity.Property(x => x.VoterKey).HasMaxLength(120);
entity.Property(x => x.NetworkTag).HasMaxLength(64);
entity.Property(x => x.Stance).HasConversion<string>().HasMaxLength(16);
entity.Property(x => x.VoterClass).HasConversion<string>().HasMaxLength(16);
entity.HasIndex(x => new { x.SubjectId, x.VoterKey }).IsUnique();
entity.HasIndex(x => new { x.NetworkTag, x.CastAtUtc });
entity.HasOne(x => x.Subject)
.WithMany()
.HasForeignKey(x => x.SubjectId)
.OnDelete(DeleteBehavior.Restrict);
entity.HasOne<UserAccount>()
.WithMany()
.HasForeignKey(x => x.UserAccountId)
.OnDelete(DeleteBehavior.SetNull);
});
}
}