#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();