Index: ChapterX.Application/Story/Commands/AddHandler.cs
===================================================================
--- ChapterX.Application/Story/Commands/AddHandler.cs	(revision 73b69b22fa1e9888b8530a66db4a150efb8f52bc)
+++ ChapterX.Application/Story/Commands/AddHandler.cs	(revision b373fea3e2c9d404606002f8e7ba265a82d68187)
@@ -1,2 +1,3 @@
+using ChapterX.Application.Abstractions;
 using ChapterX.Domain.Repositories;
 using MediatR;
@@ -10,11 +11,13 @@
         private readonly IGenreRepository _genreRepository;
         private readonly IHasGenreRepository _hasGenreRepository;
+        private readonly IApplicationDbContext _context;
         private readonly ILogger<AddHandler> _logger;
 
-        public AddHandler(IStoryRepository storyRepository, IGenreRepository genreRepository, IHasGenreRepository hasGenreRepository, ILogger<AddHandler> logger)
+        public AddHandler(IStoryRepository storyRepository, IGenreRepository genreRepository, IHasGenreRepository hasGenreRepository, IApplicationDbContext context, ILogger<AddHandler> logger)
         {
             _storyRepository = storyRepository;
             _genreRepository = genreRepository;
             _hasGenreRepository = hasGenreRepository;
+            _context = context;
             _logger = logger;
         }
@@ -22,25 +25,35 @@
         public async Task<AddResponse> Handle(AddRequest request, CancellationToken cancellationToken)
         {
-            var story = new Domain.Entities.Story
+            await using var transaction = await _context.BeginTransactionAsync(cancellationToken);
+            try
             {
-                MatureContent = request.MatureContent,
-                ShortDescription = request.ShortDescription,
-                Image = request.Image,
-                Content = request.Content,
-                UserId = request.UserId,
-                CreatedAt = DateTime.UtcNow,
-                UpdatedAt = DateTime.UtcNow
-            };
+                var story = new Domain.Entities.Story
+                {
+                    MatureContent = request.MatureContent,
+                    ShortDescription = request.ShortDescription,
+                    Image = request.Image,
+                    Content = request.Content,
+                    UserId = request.UserId,
+                    CreatedAt = DateTime.UtcNow,
+                    UpdatedAt = DateTime.UtcNow
+                };
 
-            await _storyRepository.AddAsync(story, cancellationToken);
+                await _storyRepository.AddAsync(story, cancellationToken);
 
-            foreach (var genreName in request.Genres ?? [])
+                foreach (var genreName in request.Genres ?? [])
+                {
+                    var genre = await _genreRepository.GetByNameAsync(genreName, cancellationToken);
+                    if (genre == null) continue;
+                    await _hasGenreRepository.AddAsync(new Domain.Entities.HasGenre { StoryId = story.Id, GenreId = genre.Id }, cancellationToken);
+                }
+
+                await transaction.CommitAsync(cancellationToken);
+                return new AddResponse(story.Id);
+            }
+            catch
             {
-                var genre = await _genreRepository.GetByNameAsync(genreName, cancellationToken);
-                if (genre == null) continue;
-                await _hasGenreRepository.AddAsync(new Domain.Entities.HasGenre { StoryId = story.Id, GenreId = genre.Id }, cancellationToken);
+                await transaction.RollbackAsync(cancellationToken);
+                throw;
             }
-
-            return new AddResponse(story.Id);
         }
     }
