【问题标题】:At what operation exactly does Entity Framework open and close a database connection?Entity Framework 究竟在什么操作中打开和关闭数据库连接?
【发布时间】:2020-08-02 13:49:16
【问题描述】:

所以here 是大约 11 年前提出的同一个问题的链接。它很旧,不清楚我在寻找什么。

EF 究竟何时打开和关闭数据库连接?

它是在我们创建DbContext 对象时打开的,还是在我们第一次发出请求时打开的?

当我们点击SaveChanges()时它是关闭的还是当我们手动处理对象或在using() {}?中使用它时它关闭

我浏览了 Microsoft 在线资源,但找不到我要查找的内容。

谢谢。

【问题讨论】:

标签: c# .net entity-framework entity-framework-core entity-framework-6


【解决方案1】:

底层连接在查询或非查询执行之前立即打开,并在完成后立即关闭,或者在事务进行期间关闭。 DbContext 必须正确处理。这就是您如何充分利用连接池的方法。这就是 ADO.NET 为王时我们都应该做的事情。

【讨论】:

  • 查询需要返回数据,例如 html GET 请求。插入、更新和删除被称为非查询。只要您将 IQueryable 视为返回类型,查询执行就会被延迟。调用 ToList 或类似方法返回 IEnumerable,这意味着正在执行查询。 SaveChanges 负责处理非查询。
【解决方案2】:

您可以使用其中任何一种。

使用 using()。它将在 using() 块开始时打开,并在 using() 块结束时释放。

using (var db = new YourContext())
{
    db.User.Add(user);
    db.SaveChanges();
}

Startup.cs 中的依赖注入。它在控制器被调用后打开,并在函数被调用后处理。

Startup.cs

services.AddDbContext<YourContext>(options =>
{
    options.UseSqlServer("your connection string");
    options.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking);
});

HomeController.cs

private readonly YourContext _db;
public HomeController(YourContext db)
{
    _db = db;
}
public IActionResult Index()
{
   var users = _db.Users.AsQueryable();
   return View(users);
}

【讨论】:

  • It will open at beginning of using() block 这不是真的。做一个数据库跟踪,自己看看。
猜你喜欢
  • 2010-11-19
  • 2013-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-31
  • 2017-02-01
相关资源
最近更新 更多