Куда поместить savechanges в шаблон единицы работы с asp.net mvc?

#entity-framework #asp.net-mvc-4 #entity-framework-6 #razor-2

#entity-framework #asp.net-mvc-4 #entity-framework-6 #razor-2

Вопрос:

Я использую общий шаблон репозитория в asp.net mvc. Я знаком с шаблоном репозитория, но не с единицей работы. Я читаю несколько статей от Google об этом. Но я не уверен, использую ли я unit of work с asp.net mvc, где я мог бы использовать метод Commit(), который будет вызывать метод ef SaveChanges()? Буду ли я использовать его на уровне репозитория, сервисного уровня или в контроллере. Кроме того, многие другие говорят, что Microsoft уже использует Unit Of work, встроенный в Entity Framework. Значит, нет необходимости использовать его отдельно или использовать на уровне контроллера или где-либо еще?

Спасибо, Абдус Салам Азад.

Комментарии:

1. Я голосую за то, чтобы закрыть это, поскольку по этому вопросу уже есть десятки тем SO с разными мнениями.

Ответ №1:

Да, вы должны сделать это внутри UnitOfWork.cs класса.

UnitOfWork.cs

  public sealed class UnitOfWork : IUnitOfWork
   {

       private DbContext _dbContext;

       public UnitOfWork(DbContext context)
       {         
          _dbContext = context;
       }

       public int Commit()
       {
           return _dbContext.SaveChanges();// Save changes 
       }

       public void Dispose()
       {
           Dispose(true);
           GC.SuppressFinalize(this);
       }

      private void Dispose(bool disposing)
       {
           if (disposing)
           {
               if (_dbContext != null)
               {
                   _dbContext.Dispose();
                   _dbContext = null;
               }
           }
       }
   }
 

После этого вы можете вызвать Commit метод UnitOfWork внутри сервисного уровня.

EntityService.cs

 public abstract class EntityService<T> : IEntityService<T> where T : BaseEntity
   {
       IUnitOfWork _unitOfWork;
       IGenericRepository<T> _repository;

       public EntityService(IUnitOfWork unitOfWork, IGenericRepository<T> repository)
       {
           _unitOfWork = unitOfWork;
           _repository = repository;
       }  

     public virtual void Create(T entity)
           {
               _repository.Add(entity);
               _unitOfWork.Commit(); //saving point        
           }

}
 

Вы можете узнать больше об этом шаблоне: Общий репозиторий и шаблон единицы работы

Комментарии:

1. Что делать, если вы хотите внести несколько изменений и сохранить все изменения в конце? Как бы вы справились с этим? Я нахожусь в такой ситуации, и я не могу найти правильный способ выполнить метод сохранения

2. @IonutEnache Вам нужно использовать Transactions тогда: docs.microsoft.com/en-us/ef/core/saving/transactions

Ответ №2:

Если у вас есть несколько операций по одной и той же транзакции. Затем, после завершения всех ваших операций, вам нужно будет, наконец, установить savechanges(). Если это удалось, все операции будут выполнены успешно, а в случае сбоя все операции будут завершены неудачно и отменены.

             _employeeService.UpdateVehicleDetail(model);
            _employeeService.UpdateLicenseDetail(model);
            await CurrentUnitOfWork.SaveChangesAsync();