1
0

DataContext.cs 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. using Masuit.MyBlogs.Core.Models.Entity;
  2. using Microsoft.EntityFrameworkCore;
  3. using Microsoft.EntityFrameworkCore.Diagnostics;
  4. namespace Masuit.MyBlogs.Core.Infrastructure;
  5. public class DataContext : DbContext
  6. {
  7. public DataContext(DbContextOptions<DataContext> options) : base(options)
  8. {
  9. }
  10. protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
  11. {
  12. optionsBuilder.EnableDetailedErrors().UseLazyLoadingProxies().UseQueryTrackingBehavior(QueryTrackingBehavior.TrackAll).ConfigureWarnings(builder => builder.Ignore(CoreEventId.DetachedLazyLoadingWarning));
  13. }
  14. protected override void OnModelCreating(ModelBuilder modelBuilder)
  15. {
  16. base.OnModelCreating(modelBuilder);
  17. modelBuilder.Entity<Category>().HasMany(e => e.Post).WithOne(e => e.Category).OnDelete(DeleteBehavior.Cascade);
  18. modelBuilder.Entity<Category>().HasMany(e => e.PostHistoryVersion).WithOne(e => e.Category).HasForeignKey(r => r.CategoryId).OnDelete(DeleteBehavior.Cascade);
  19. modelBuilder.Entity<Category>().HasMany(e => e.Children).WithOne(c => c.Parent).IsRequired(false).HasForeignKey(c => c.ParentId).OnDelete(DeleteBehavior.Cascade);
  20. modelBuilder.Entity<Category>().Property(c => c.Path).IsRequired();
  21. modelBuilder.Entity<Post>().HasMany(e => e.Comment).WithOne(e => e.Post).HasForeignKey(r => r.PostId).OnDelete(DeleteBehavior.Cascade);
  22. modelBuilder.Entity<Post>().HasMany(e => e.PostHistoryVersion).WithOne(e => e.Post).HasForeignKey(r => r.PostId).OnDelete(DeleteBehavior.Cascade);
  23. modelBuilder.Entity<Post>().HasMany(e => e.Seminar).WithMany(s => s.Post).UsingEntity(builder => builder.ToTable("SeminarPost"));
  24. modelBuilder.Entity<Post>().HasMany(e => e.PostMergeRequests).WithOne(s => s.Post).HasForeignKey(r => r.PostId).OnDelete(DeleteBehavior.Cascade);
  25. modelBuilder.Entity<Post>().HasMany(e => e.PostVisitRecords).WithOne().HasForeignKey(r => r.PostId).OnDelete(DeleteBehavior.Cascade);
  26. modelBuilder.Entity<Post>().HasMany(e => e.PostVisitRecordStats).WithOne().HasForeignKey(r => r.PostId).OnDelete(DeleteBehavior.Cascade);
  27. modelBuilder.Entity<PostHistoryVersion>().HasMany(e => e.Seminar).WithMany(s => s.PostHistoryVersion).UsingEntity(builder => builder.ToTable("SeminarPostHistoryVersion"));
  28. modelBuilder.Entity<UserInfo>().HasMany(e => e.LoginRecord).WithOne(e => e.UserInfo).OnDelete(DeleteBehavior.Cascade);
  29. modelBuilder.Entity<Menu>().HasMany(e => e.Children).WithOne(m => m.Parent).IsRequired(false).OnDelete(DeleteBehavior.Cascade);
  30. modelBuilder.Entity<Menu>().Property(c => c.Path).IsRequired();
  31. modelBuilder.Entity<Comment>().HasMany(e => e.Children).WithOne(c => c.Parent).HasForeignKey(c => c.ParentId).IsRequired(false).OnDelete(DeleteBehavior.Cascade);
  32. modelBuilder.Entity<Comment>().Property(c => c.Path).IsRequired();
  33. modelBuilder.Entity<Comment>().Property(c => c.GroupTag).IsRequired();
  34. modelBuilder.Entity<LeaveMessage>().HasMany(e => e.Children).WithOne(c => c.Parent).HasForeignKey(c => c.ParentId).IsRequired(false).OnDelete(DeleteBehavior.Cascade);
  35. modelBuilder.Entity<LeaveMessage>().Property(c => c.Path).IsRequired();
  36. modelBuilder.Entity<LeaveMessage>().Property(c => c.GroupTag).IsRequired();
  37. modelBuilder.Entity<Links>().HasMany(e => e.Loopbacks).WithOne(l => l.Links).IsRequired().HasForeignKey(e => e.LinkId).OnDelete(DeleteBehavior.Cascade);
  38. modelBuilder.Entity<Advertisement>().HasMany(e => e.ClickRecords).WithOne().HasForeignKey(e => e.AdvertisementId).IsRequired().OnDelete(DeleteBehavior.Cascade);
  39. modelBuilder.Entity<Advertisement>().HasIndex(a => a.Price).IsDescending();
  40. modelBuilder.Entity<AdvertisementClickRecord>().HasIndex(a => a.Time);
  41. modelBuilder.Entity<AdvertisementClickRecord>().HasIndex(a => a.AdvertisementId);
  42. modelBuilder.Entity<Category>().HasIndex(a => a.ParentId);
  43. modelBuilder.Entity<Comment>().HasIndex(a => a.PostId);
  44. modelBuilder.Entity<LeaveMessage>().HasIndex(a => a.PostDate).IsDescending();
  45. modelBuilder.Entity<LinkLoopback>().HasIndex(a => a.LinkId);
  46. modelBuilder.Entity<Links>().HasIndex(a => a.Recommend);
  47. modelBuilder.Entity<LoginRecord>().HasIndex(a => a.UserInfoId);
  48. modelBuilder.Entity<Menu>().HasIndex(a => a.Sort);
  49. modelBuilder.Entity<Menu>().HasIndex(a => a.ParentId);
  50. modelBuilder.Entity<Notice>().HasIndex(a => a.ModifyDate).IsDescending();
  51. modelBuilder.Entity<Post>().HasIndex(a => a.CategoryId);
  52. modelBuilder.Entity<Post>().HasIndex(a => a.ModifyDate).IsDescending();
  53. modelBuilder.Entity<Post>().HasIndex(a => a.AverageViewCount).IsDescending();
  54. modelBuilder.Entity<Post>().HasIndex(a => a.TotalViewCount).IsDescending();
  55. modelBuilder.Entity<PostHistoryVersion>().HasIndex(a => a.CategoryId);
  56. modelBuilder.Entity<PostHistoryVersion>().HasIndex(a => a.PostId);
  57. modelBuilder.Entity<PostMergeRequest>().HasIndex(a => a.PostId);
  58. modelBuilder.Entity<PostVisitRecord>().HasIndex(a => a.PostId);
  59. modelBuilder.Entity<PostVisitRecord>().HasIndex(a => a.Time).IsDescending();
  60. modelBuilder.Entity<PostVisitRecordStats>().HasIndex(a => a.Date).IsDescending();
  61. modelBuilder.Entity<PostVisitRecordStats>().HasIndex(a => a.PostId);
  62. modelBuilder.Entity<SearchDetails>().HasIndex(a => a.SearchTime).IsDescending();
  63. }
  64. public override int SaveChanges()
  65. {
  66. DbUpdateConcurrencyException ex = null;
  67. for (int i = 0; i < 5; i++)
  68. {
  69. try
  70. {
  71. return base.SaveChanges();
  72. }
  73. catch (DbUpdateConcurrencyException e)
  74. {
  75. ex = e;
  76. var entry = e.Entries.Single();
  77. var databaseValues = entry.GetDatabaseValues();
  78. var resolvedValues = databaseValues.Clone();
  79. entry.OriginalValues.SetValues(databaseValues);
  80. entry.CurrentValues.SetValues(resolvedValues);
  81. }
  82. }
  83. throw ex;
  84. }
  85. public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken = new())
  86. {
  87. DbUpdateConcurrencyException ex = null;
  88. for (int i = 0; i < 5; i++)
  89. {
  90. try
  91. {
  92. return await base.SaveChangesAsync(cancellationToken);
  93. }
  94. catch (DbUpdateConcurrencyException e)
  95. {
  96. ex = e;
  97. var entry = e.Entries.Single();
  98. var databaseValues = await entry.GetDatabaseValuesAsync(cancellationToken);
  99. var resolvedValues = databaseValues.Clone();
  100. entry.OriginalValues.SetValues(databaseValues);
  101. entry.CurrentValues.SetValues(resolvedValues);
  102. }
  103. }
  104. throw ex;
  105. }
  106. public virtual DbSet<Category> Category { get; set; }
  107. public virtual DbSet<Comment> Comment { get; set; }
  108. public virtual DbSet<LeaveMessage> LeaveMessage { get; set; }
  109. public virtual DbSet<Links> Links { get; set; }
  110. public virtual DbSet<Menu> Menu { get; set; }
  111. public virtual DbSet<Misc> Misc { get; set; }
  112. public virtual DbSet<Notice> Notice { get; set; }
  113. public virtual DbSet<Post> Post { get; set; }
  114. public virtual DbSet<PostHistoryVersion> PostHistoryVersion { get; set; }
  115. public virtual DbSet<SearchDetails> SearchDetails { get; set; }
  116. public virtual DbSet<SystemSetting> SystemSetting { get; set; }
  117. public virtual DbSet<UserInfo> UserInfo { get; set; }
  118. public virtual DbSet<LoginRecord> LoginRecord { get; set; }
  119. public virtual DbSet<Donate> Donate { get; set; }
  120. public virtual DbSet<Seminar> Seminar { get; set; }
  121. public virtual DbSet<InternalMessage> InternalMessage { get; set; }
  122. public virtual DbSet<FastShare> FastShare { get; set; }
  123. public virtual DbSet<PostMergeRequest> PostMergeRequests { get; set; }
  124. public virtual DbSet<Advertisement> Advertisements { get; set; }
  125. public virtual DbSet<Variables> Variables { get; set; }
  126. public virtual DbSet<LinkLoopback> LinkLoopbacks { get; set; }
  127. public virtual DbSet<PostTag> PostTags { get; set; }
  128. }