ASP.Net MVC - Entity Framework 6 иногда создает дубликаты записей? - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть приложение ASP.Net MVC 5, использующее EF6. Я использую Ninject для внедрения зависимостей.

У меня есть следующий код для добавления комментариев к заявке. Но иногда это создает дублирующую запись. Почему это происходит и как я могу это исправить?

Таким образом, в итоге я добавил 3 комментария, а не два с дублированием комментариев пользователей - это происходит только изредка.

 var ticket = _unitOfWork.TicketRepository.GetTicket(dto.TicketId);

 using (var transaction = _unitOfWork.BeginTransaction())
 {
       try
       {
             // Add user posted comment
             var comment = new Comment
             {
                TicketId = dto.TicketId,
                Comments = dto.Comments
             };

             ticket.AddComment(comment);

             // save changes
             _unitOfWork.Complete();

             // Add a system comment
             ticket.AddComment(new Comment                    
             {
                TicketId = dto.TicketId,
                Comments = "<b>System Comment:</b><br>Some auto comment"
             });

             _notificationService.Send(ticket, comment, User.Identity.GetUserId());

             // save changes
             _unitOfWork.Complete();

             // Commit
             transaction.Commit();

             return Ok(Mapper.Map<CommentDto>(_unitOfWork.CommentRepository.GetComment(comment.Id)));

      }
      catch (Exception ex)
      {
            transaction.Rollback();

            return InternalServerError(ex);
       }

 }

Это методы в моем классе unitOfWork:

 public void Complete()
 {
        _context.SaveChanges();
 }

 public DbContextTransaction BeginTransaction()
 {
        return _context.Database.BeginTransaction();
 }

Это метод добавления комментариев в моем классе Ticket:

 public void AddComment(Comment comment)
 {
        Comments.Add(comment);
 }

* ОБНОВЛЕНИЕ *

Единственное, что мне известно о том, что в контексте db используется фоновая работа для отправки электронной почты, которая выполняется каждую минуту с использованием hangfire, но не использует unitofwork - см. Мой код ниже:

 [DisallowConcurrentExecution]
 public class EmailJob : IJob 
 {

    private readonly Logger _logger = LogManager.GetCurrentClassLogger();
    private readonly IUserNotificationRepository _userNotificationRepository;
    private readonly INotificationMailer _notificationMailer;
    private readonly ApplicationDbContext _context;

    public EmailJob()
    {
        _context = new ApplicationDbContext();
        _userNotificationRepository = new UserNotificationRepository(_context);
        _notificationMailer = new NotificationMailer();
    }


    public EmailJob(IUserNotificationRepository userNotificationRepository,
        INotificationMailer notificationMailer)
    {
        _userNotificationRepository = userNotificationRepository;
        _notificationMailer = notificationMailer;
    }

    // Use for hangfire
    public void Execute()
    {
        SendMail(_logger);
    }

    private void SendMail(Logger logger)
    {
        // some mail sending code...

        // Persist changes back to database
         _context.SaveChanges();
    }
}

Есть идеи, парни?

...