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

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

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


person Abdus Salam Azad    schedule 15.10.2016    source источник
comment
Я голосую за то, чтобы закрыть это, так как по этому поводу уже есть десятки тем SO с разными мнениями.   -  person Wiktor Zychla    schedule 15.10.2016


Ответы (2)


Да, вы должны сделать это внутри класса 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 внутри Service Layer.

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        
           }

}

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

person Sampath    schedule 15.10.2016
comment
Что делать, если вы хотите внести несколько изменений и сохранить все изменения в конце? Как бы вы справились с этим? Я в этой ситуации, и я не могу найти правильный способ сделать метод сохранения - person Ionut Enache; 17.06.2021
comment
@IonutEnache Вам нужно использовать Transactions, затем: docs.microsoft.com/en -us/ef/core/saving/transactions - person Sampath; 18.06.2021

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

            _employeeService.UpdateVehicleDetail(model);
            _employeeService.UpdateLicenseDetail(model);
            await CurrentUnitOfWork.SaveChangesAsync();
person Community    schedule 13.09.2018