【发布时间】:2016-01-22 16:59:11
【问题描述】:
根据我配置 DbContext 时的文档,如下 DI 将其注册在范围内(每个 http 请求)
services.AddEntityFramework()
.AddSqlServer()
.AddDbContext<DBData>(options => {
options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]);
}
);
当我试图在另一个线程中访问它时出现问题。
public class HomeController : Controller
{
private readonly DBData _context;
public HomeController(DBData context)
{
_context = context;
}
public IActionResult StartInBackground()
{
Task.Run(() =>
{
Thread.Sleep(3000);
//System.ObjectDisposedException here
var res = _context.Users.FirstOrDefault(x => x.Id == 1);
});
return View();
}
}
我想为每次调用 (AddTransition) 配置 DbContext 创建。这将使我有可能编写下一个代码
public void ConfigureServices(IServiceCollection services)
{
services.AddEntityFramework()
.AddSqlServer()
.AddDbContext<DBData>(options => {
//somehow configure it to use AddTransient
options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]);
}
);
services.AddTransient<IUnitOfWorkFactoryPerCall, UnitOfWorkFactory>();
services.AddScoped<IUnitOfWorkFactoryPerRequest, UnitOfWorkFactory>();
services.AddMvc();
}
public interface IUnitOfWorkFactoryPerCall : IUnitOfWorkFactory { }
public interface IUnitOfWorkFactoryPerRequest : IUnitOfWorkFactory { }
public interface IUnitOfWorkFactory : IDisposable
{
DBData Context { get; }
}
public class UnitOfWorkFactory : IUnitOfWorkFactoryPerCall, IUnitOfWorkFactoryPerRequest
{
public UnitOfWorkFactory(DBData context)
{
Context = context;
}
public DBData Context
{
get; private set;
}
public void Dispose()
{
Context.Dispose();
}
}
所以现在如果我想为每个请求创建 DBContext,我将使用 IUnitOfWorkFactoryPerRequest,而当我想在某个后台线程中使用 DBContext 时,我可以使用 IUnitOfWorkFactoryPerCall。
【问题讨论】:
-
你有什么消息吗?有类似的任务在另一个线程中使用 DbContext。
标签: c# asp.net-core asp.net-core-mvc entity-framework-core