【问题标题】:Creating a Second -- and Even Third -- DbContext创建第二个——甚至第三个——DbContext
【发布时间】:2019-08-01 10:50:30
【问题描述】:

我有一个使用 EFCore 的项目。在我的控制器中,我有一个通过 DI 传入的 DbContext(即,在 Startup.cs 的 ConfigureServices 中,我正在调用 services.AddDbContext(...))。

这很简单。但是,在我的控制器中,我对数据库进行了三次调用以创建一个 SINGLE 对象。不幸的是,它不是通过 LINQ 连接完成的。这是一个小例子...

var user = this.Context.Users.FirstOrDefault(...);
var room = this.Context.Rooms.FirstOrDefault(...);
var util = this.Context.Utilities.FirstOrDefault(...);

return new
{
  User = user,
  Room = room,
  Util = util
};

当然,事情没那么简单,但你明白了;我在一个 DbContext 下同步运行了三个不同的数据库调用。但是,调用都是独立的,所以我想我可以加快这个过程,我使用了 Task.WaitAll(...)。

var user = this.Context.Users.FirstOrDefaultAsync(...);
var room = this.Context.Rooms.FirstOrDefaultAsync(...);
var util = this.Context.Utilities.FirstOrDefaultAsync(...);

Task.WaitAll(user, room, util);

return new
{
  User = user.Result,
  Room = room.Result,
  Util = util.Result
};

这就是让我陷入困境的原因。我收到了错误:

在前一个操作完成之前,在此上下文中启动了第二个操作。这通常是由使用相同 DbContext 实例的不同线程引起的,但是不能保证实例成员是线程安全的。这也可能是由在客户端上评估嵌套查询引起的,如果是这种情况,请重写查询以避免嵌套调用。

我意识到上下文是在多个线程上运行的,但我如何完成加快这三个查询?在我的场景中,我使用的是 DI,因此只创建并注入了我的 DbContext 的一个实例。此外,创建 DbContext 的多个实例看起来很草率,尤其是在我已经在使用 DI 的情况下。非常感谢您的建议和建议。也许创建 DbContext 的那些本地化实例是唯一的方法?

【问题讨论】:

  • 这三种类型你有关系吗?
  • 拥有不同的上下文不会帮助您实现与已有的不同的任何事情。它仍然是对数据库的 3 次调用。您需要的是尝试以某种方式加入表格并投影您想要的数据,因此所有内容都在一个 db 调用中引入。

标签: entity-framework-core


【解决方案1】:

如果表之间没有关系,那么你不能使用实体框架来做到这一点。

如果你坚持减少数据库往返次数,并且可以在项目中引入额外的依赖项,你可以做的是使用Dapper,它提供了一个QueryMultiple API在一次往返中返回多个结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    • 2017-03-11
    • 2017-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多