using Masuit.MyBlogs.Core.Models.Entity; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Diagnostics; namespace Masuit.MyBlogs.Core.Infrastructure; public class DataContext : DbContext { public DataContext(DbContextOptions options) : base(options) { } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.EnableDetailedErrors().UseLazyLoadingProxies().UseQueryTrackingBehavior(QueryTrackingBehavior.TrackAll).ConfigureWarnings(builder => builder.Ignore(CoreEventId.DetachedLazyLoadingWarning)); } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity().HasMany(e => e.Post).WithOne(e => e.Category).OnDelete(DeleteBehavior.Cascade); modelBuilder.Entity().HasMany(e => e.PostHistoryVersion).WithOne(e => e.Category).HasForeignKey(r => r.CategoryId).OnDelete(DeleteBehavior.Cascade); modelBuilder.Entity().HasMany(e => e.Children).WithOne(c => c.Parent).IsRequired(false).HasForeignKey(c => c.ParentId).OnDelete(DeleteBehavior.Cascade); modelBuilder.Entity().Property(c => c.Path).IsRequired(); modelBuilder.Entity().HasMany(e => e.Comment).WithOne(e => e.Post).HasForeignKey(r => r.PostId).OnDelete(DeleteBehavior.Cascade); modelBuilder.Entity().HasMany(e => e.PostHistoryVersion).WithOne(e => e.Post).HasForeignKey(r => r.PostId).OnDelete(DeleteBehavior.Cascade); modelBuilder.Entity().HasMany(e => e.Seminar).WithMany(s => s.Post).UsingEntity(builder => builder.ToTable("SeminarPost")); modelBuilder.Entity().HasMany(e => e.PostMergeRequests).WithOne(s => s.Post).HasForeignKey(r => r.PostId).OnDelete(DeleteBehavior.Cascade); modelBuilder.Entity().HasMany(e => e.PostVisitRecords).WithOne().HasForeignKey(r => r.PostId).OnDelete(DeleteBehavior.Cascade); modelBuilder.Entity().HasMany(e => e.PostVisitRecordStats).WithOne().HasForeignKey(r => r.PostId).OnDelete(DeleteBehavior.Cascade); modelBuilder.Entity().HasMany(e => e.Seminar).WithMany(s => s.PostHistoryVersion).UsingEntity(builder => builder.ToTable("SeminarPostHistoryVersion")); modelBuilder.Entity().HasMany(e => e.LoginRecord).WithOne(e => e.UserInfo).OnDelete(DeleteBehavior.Cascade); modelBuilder.Entity().HasMany(e => e.Children).WithOne(m => m.Parent).IsRequired(false).OnDelete(DeleteBehavior.Cascade); modelBuilder.Entity().Property(c => c.Path).IsRequired(); modelBuilder.Entity().HasMany(e => e.Children).WithOne(c => c.Parent).HasForeignKey(c => c.ParentId).IsRequired(false).OnDelete(DeleteBehavior.Cascade); modelBuilder.Entity().Property(c => c.Path).IsRequired(); modelBuilder.Entity().Property(c => c.GroupTag).IsRequired(); modelBuilder.Entity().HasMany(e => e.Children).WithOne(c => c.Parent).HasForeignKey(c => c.ParentId).IsRequired(false).OnDelete(DeleteBehavior.Cascade); modelBuilder.Entity().Property(c => c.Path).IsRequired(); modelBuilder.Entity().Property(c => c.GroupTag).IsRequired(); modelBuilder.Entity().HasMany(e => e.Loopbacks).WithOne(l => l.Links).IsRequired().HasForeignKey(e => e.LinkId).OnDelete(DeleteBehavior.Cascade); modelBuilder.Entity().HasMany(e => e.ClickRecords).WithOne().HasForeignKey(e => e.AdvertisementId).IsRequired().OnDelete(DeleteBehavior.Cascade); modelBuilder.Entity().HasIndex(a => a.Price).IsDescending(); modelBuilder.Entity().HasIndex(a => a.Time); modelBuilder.Entity().HasIndex(a => a.AdvertisementId); modelBuilder.Entity().HasIndex(a => a.ParentId); modelBuilder.Entity().HasIndex(a => a.PostId); modelBuilder.Entity().HasIndex(a => a.PostDate).IsDescending(); modelBuilder.Entity().HasIndex(a => a.LinkId); modelBuilder.Entity().HasIndex(a => a.Recommend); modelBuilder.Entity().HasIndex(a => a.UserInfoId); modelBuilder.Entity().HasIndex(a => a.Sort); modelBuilder.Entity().HasIndex(a => a.ParentId); modelBuilder.Entity().HasIndex(a => a.ModifyDate).IsDescending(); modelBuilder.Entity().HasIndex(a => a.CategoryId); modelBuilder.Entity().HasIndex(a => a.ModifyDate).IsDescending(); modelBuilder.Entity().HasIndex(a => a.AverageViewCount).IsDescending(); modelBuilder.Entity().HasIndex(a => a.TotalViewCount).IsDescending(); modelBuilder.Entity().HasIndex(a => a.CategoryId); modelBuilder.Entity().HasIndex(a => a.PostId); modelBuilder.Entity().HasIndex(a => a.PostId); modelBuilder.Entity().HasIndex(a => a.PostId); modelBuilder.Entity().HasIndex(a => a.Time).IsDescending(); modelBuilder.Entity().HasIndex(a => a.Date).IsDescending(); modelBuilder.Entity().HasIndex(a => a.PostId); modelBuilder.Entity().HasIndex(a => a.SearchTime).IsDescending(); } public override int SaveChanges() { DbUpdateConcurrencyException ex = null; for (int i = 0; i < 5; i++) { try { return base.SaveChanges(); } catch (DbUpdateConcurrencyException e) { ex = e; var entry = e.Entries.Single(); var databaseValues = entry.GetDatabaseValues(); var resolvedValues = databaseValues.Clone(); entry.OriginalValues.SetValues(databaseValues); entry.CurrentValues.SetValues(resolvedValues); } } throw ex; } public override async Task SaveChangesAsync(CancellationToken cancellationToken = new()) { DbUpdateConcurrencyException ex = null; for (int i = 0; i < 5; i++) { try { return await base.SaveChangesAsync(cancellationToken); } catch (DbUpdateConcurrencyException e) { ex = e; var entry = e.Entries.Single(); var databaseValues = await entry.GetDatabaseValuesAsync(cancellationToken); var resolvedValues = databaseValues.Clone(); entry.OriginalValues.SetValues(databaseValues); entry.CurrentValues.SetValues(resolvedValues); } } throw ex; } public virtual DbSet Category { get; set; } public virtual DbSet Comment { get; set; } public virtual DbSet LeaveMessage { get; set; } public virtual DbSet Links { get; set; } public virtual DbSet Menu { get; set; } public virtual DbSet Misc { get; set; } public virtual DbSet Notice { get; set; } public virtual DbSet Post { get; set; } public virtual DbSet PostHistoryVersion { get; set; } public virtual DbSet SearchDetails { get; set; } public virtual DbSet SystemSetting { get; set; } public virtual DbSet UserInfo { get; set; } public virtual DbSet LoginRecord { get; set; } public virtual DbSet Donate { get; set; } public virtual DbSet Seminar { get; set; } public virtual DbSet InternalMessage { get; set; } public virtual DbSet FastShare { get; set; } public virtual DbSet PostMergeRequests { get; set; } public virtual DbSet Advertisements { get; set; } public virtual DbSet Variables { get; set; } public virtual DbSet LinkLoopbacks { get; set; } public virtual DbSet PostTags { get; set; } }