如何在长 运行 进程中处理 Entity Framework 生命周期?
How to handle Entity Framework lifetime in a long-running process?
我正在制作一个数据提取工具(.NET Core 控制台应用程序),它将处理数万个文件并将提取的数据写入数据库。只有对数据库的插入,没有读取或更新。我打算 运行 多个实例,全部写入相同的 table.
我正在使用 Autofac 进行 DI,并将 EF DB 上下文注入 class,循环遍历文件并写入数据库。
我想缩短 DB 上下文的生命周期,但不确定如何使用 DI 做到这一点。是否有某种“刷新”操作可以有效地更新 DBContext?或者我应该注入一个 DBContextFactory 并为每个处理的文件获取一个新的 DBContext 吗? (如果是这样,工厂是什么样的?它是否显式构造了一个新的 DBContext?)
如果您持有注入的 DbContext 实例并在循环中使用它,那么显然 DbContext 的生命周期不能短。
按照您的建议,在 DI 中使用 Context Builder。下面是一个使用 SQLServer 创建 T 类型上下文的示例:
public class DbContextBuilder<T> where T : DbContext
{
public readonly T Context;
public DbContextBuilder(string connectionStringName)
{
IConfigurationBuilder cfgBuilder = new ConfigurationBuilder();
cfgBuilder.AddJsonFile("appsettings.json");
IConfiguration cfg = cfgBuilder.Build();
DbContextOptionsBuilder<T> optsBuilders = new DbContextOptionsBuilder<T>();
optsBuilders.UseSqlServer(cfg.GetConnectionString(connectionStringName));
Context = (T)Activator.CreateInstance(typeof(T), optsBuilders.Options);
}
}
并且在每个循环中:
foreach (var file in files)
{
using (DbContext ctx = new DbContextBuilder<DbContext>("{name of conn string in appsettings}").Context)
{
// Do you writes for the current file
}
}
我正在制作一个数据提取工具(.NET Core 控制台应用程序),它将处理数万个文件并将提取的数据写入数据库。只有对数据库的插入,没有读取或更新。我打算 运行 多个实例,全部写入相同的 table.
我正在使用 Autofac 进行 DI,并将 EF DB 上下文注入 class,循环遍历文件并写入数据库。
我想缩短 DB 上下文的生命周期,但不确定如何使用 DI 做到这一点。是否有某种“刷新”操作可以有效地更新 DBContext?或者我应该注入一个 DBContextFactory 并为每个处理的文件获取一个新的 DBContext 吗? (如果是这样,工厂是什么样的?它是否显式构造了一个新的 DBContext?)
如果您持有注入的 DbContext 实例并在循环中使用它,那么显然 DbContext 的生命周期不能短。
按照您的建议,在 DI 中使用 Context Builder。下面是一个使用 SQLServer 创建 T 类型上下文的示例:
public class DbContextBuilder<T> where T : DbContext
{
public readonly T Context;
public DbContextBuilder(string connectionStringName)
{
IConfigurationBuilder cfgBuilder = new ConfigurationBuilder();
cfgBuilder.AddJsonFile("appsettings.json");
IConfiguration cfg = cfgBuilder.Build();
DbContextOptionsBuilder<T> optsBuilders = new DbContextOptionsBuilder<T>();
optsBuilders.UseSqlServer(cfg.GetConnectionString(connectionStringName));
Context = (T)Activator.CreateInstance(typeof(T), optsBuilders.Options);
}
}
并且在每个循环中:
foreach (var file in files)
{
using (DbContext ctx = new DbContextBuilder<DbContext>("{name of conn string in appsettings}").Context)
{
// Do you writes for the current file
}
}