У меня есть пакетное задание, которое анализирует файл CSV, создает и обрабатывает записи.В каждой строке я должен выполнять коммиты, так как мне нужно создавать сущности, а затем использовать результаты созданных сущностей.
Поскольку существует тысячи записей, производительность снижается, и я пытаюсь улучшить свою производительность.
У меня есть код, который выглядит примерно так:
var data = ParseExcel(filePath);
Setup();
foreach (var batch in data.Split(20))
{
foreach (var row in batch)
{
try
{
ParseRow(row);
}
catch (Exception e)
{
JobLogger.Error(e, "Failed to parse row. Exception: " + e.Message);
throw;
}
}
_unitOfWork.Commit();
_unitOfWork.Dispose();
_unitOfWork = LifetimeScope.Resolve<Owned<IUnitOfWork>>().Value;
ClientRepository = LifetimeScope.Resolve<Owned<IEntityBaseRepository<Client>>>().Value;
Мой метод Dispose выглядит следующим образом:
public void Dispose()
{
_dbContext.Dispose();
_dbContext = null;
_dbFactory.Dispose();
_dbFactory = null;
GC.SuppressFinalize(this);
}
Намерение здесь заключается в том, что после каждой партии записейобработан, я хочу обновить единицу работы, утилизировав ее и запросив, чтобы Autofac сгенерировал ее новый экземпляр.
Однако, когда я добавляю элемент в мой ClientRepository, он падает с ошибкой:
Операция не может быть завершена из-за удаления DbContext.
Мой ClientRepository использует общий класс репозитория, который выглядит следующим образом:
public class EntityBaseRepository<T> : IEntityBaseRepository<T> where T : class, IEntityBase, new()
{
private DataContext _dataContext;
#region Properties
protected IDbFactory DbFactory
{
get;
}
protected DataContext DbContext => _dataContext ?? (_dataContext = DbFactory.Initialise());
public EntityBaseRepository(IDbFactory dbFactory)
{
DbFactory = dbFactory;
}
#endregion
Вот часть моего UnitOfWork:
public class UnitOfWork : IUnitOfWork, IDisposable
{
private IDbFactory _dbFactory;
private DataContext _dbContext;
public UnitOfWork(IDbFactory dbFactory)
{
_dbFactory = dbFactory;
}
public DataContext DbContext => _dbContext ?? (_dbContext = _dbFactory.Initialise());
public void Commit()
{
DbContext.Commit();
}
Любые мысли опочему я все еще получаю эту ошибку?