如何在asp.net core和ef7中的并行方法中使用注入的DbContext?
我有一个EF7的Asp.net 5 / Core 1应用程序。 我通常在DI容器中注册DbContext。
services.AddEntityFramework().AddSqlServer() .AddDbContext(options => options.UseSqlServer(connection));
这是一个小样本,展示了我正在尝试做的事情。
public class MyController : Controller { MyDbContext _myDbContext; public MyController(MyDbContext myDbContext) { _myDbContext = myDbContext; } public IActionResult Index() { //Just start these and don't wait for them to finish //We don't care if they succeed or not Task.Run(() => DoSomeLogging1()); Task.Run(() => DoSomeLogging2()); return View(); } private void DoSomeLogging1() { _myDbContext.Items.ToList(); } private void DoSomeLogging2() { _myDbContext.Items.ToList(); } }
两个DoSomeLoggingX方法都将使用注入控制器的MyDbContext实例。 由于这些方法同时运行db查询,另一个方法总是会失败
连接没有关闭。 连接的当前状态是连接。
MyDbContext也使用DI来获取一些引用,所以即使我想要也不能直接使用它。
如何并行运行代码并仍然能够通过entity framework使用我的数据库?
我也遇到了这个问题,现在我使用我的临时解决方案EF 7(Core)。 像AddTransient一样创建DBContext
如果有人能提供更优雅的解决方案,我将不胜感激。 有时我真的需要将即时结果返回给用户,在这种情况下,await / async不适合
简单回答:你做不到。 EF不是为并行sql执行而做的(我想也永远不会)。
不太简单的答案。 可能这不是解决问题的正确方法(@Tseng在他的评论中提到了一点),但是如果你需要做类似的日志记录,你可以:
- 使两个日志记录操作顺序并共享相同的EF实例
- 使用普通的旧SQL和SqlConnection对象(它与并行处理完美配合) – 而且速度更快
- 使用像NLog这样的日志记录框架,它支持log-and-forget方法