【发布时间】:2018-12-17 13:45:06
【问题描述】:
我有一个批处理作业,它正在解析 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();
}
关于为什么我仍然收到此错误的任何想法?
【问题讨论】:
-
请贴代码而不是截图
-
已更新代码。
标签: c# entity-framework entity-framework-6 autofac