Index: ChapterX.Infrastructure/Data/DataContext/ApplicationDbContext.cs
===================================================================
--- ChapterX.Infrastructure/Data/DataContext/ApplicationDbContext.cs	(revision 0b502c2664f4d6c64626f3394b4f1dc540e0aa9b)
+++ ChapterX.Infrastructure/Data/DataContext/ApplicationDbContext.cs	(revision a8f4a2de5e875427a864aef1aa2ca9b7905549cc)
@@ -88,4 +88,5 @@
                 e.Property(x => x.Id).HasColumnName("story_id");
                 e.Property(x => x.MatureContent).HasColumnName("mature_content");
+                e.Property(x => x.Title).HasColumnName("title");
                 e.Property(x => x.ShortDescription).HasColumnName("short_description");
                 e.Property(x => x.Image).HasColumnName("image");
Index: ChapterX.Infrastructure/Repositories/ChapterRepository.cs
===================================================================
--- ChapterX.Infrastructure/Repositories/ChapterRepository.cs	(revision 0b502c2664f4d6c64626f3394b4f1dc540e0aa9b)
+++ ChapterX.Infrastructure/Repositories/ChapterRepository.cs	(revision a8f4a2de5e875427a864aef1aa2ca9b7905549cc)
@@ -31,4 +31,11 @@
                 .FirstOrDefaultAsync(c => c.Id == id, cancellationToken);
         }
+
+        public async Task IncrementViewCountAsync(int id, CancellationToken cancellationToken = default)
+        {
+            await _dbSet
+                .Where(c => c.Id == id)
+                .ExecuteUpdateAsync(s => s.SetProperty(c => c.ViewCount, c => c.ViewCount + 1), cancellationToken);
+        }
     }
 }
Index: ChapterX.Infrastructure/Repositories/GenericRepository.cs
===================================================================
--- ChapterX.Infrastructure/Repositories/GenericRepository.cs	(revision 0b502c2664f4d6c64626f3394b4f1dc540e0aa9b)
+++ ChapterX.Infrastructure/Repositories/GenericRepository.cs	(revision a8f4a2de5e875427a864aef1aa2ca9b7905549cc)
@@ -18,5 +18,5 @@
         }
 
-        public async Task<T?> GetByIdAsync(int id, CancellationToken cancellationToken = default)
+        public virtual async Task<T?> GetByIdAsync(int id, CancellationToken cancellationToken = default)
             => await _dbSet.FindAsync([id], cancellationToken);
 
Index: ChapterX.Infrastructure/Repositories/StoryRepository.cs
===================================================================
--- ChapterX.Infrastructure/Repositories/StoryRepository.cs	(revision 0b502c2664f4d6c64626f3394b4f1dc540e0aa9b)
+++ ChapterX.Infrastructure/Repositories/StoryRepository.cs	(revision a8f4a2de5e875427a864aef1aa2ca9b7905549cc)
@@ -25,4 +25,17 @@
         }
 
+        public override async Task<Story?> GetByIdAsync(int id, CancellationToken cancellationToken = default)
+        {
+            return await _dbSet
+                .Include(s => s.HasGenres)
+                    .ThenInclude(hg => hg.Genre)
+                .Include(s => s.Writer)
+                    .ThenInclude(w => w!.User)
+                .Include(s => s.Likes)
+                .Include(s => s.Comments)
+                .Include(s => s.Chapters)
+                .FirstOrDefaultAsync(s => s.Id == id, cancellationToken);
+        }
+
         public async Task<IEnumerable<Story>> GetByWriterIdAsync(int writerId, CancellationToken cancellationToken = default)
         {
