【问题标题】:Entity Framework Core: How to get the Connection from the DbContext?实体框架核心:如何从 DbContext 获取连接?
【发布时间】:2017-06-15 14:25:43
【问题描述】:

我正在尝试使用 MySQL 连接器的新 Entity Framework Core。

我可以得到一个有效的DbContext 并写入数据库,所以一切都已正确设置。

我需要从DbContext 中获取Connection,因为我必须在应用程序开始使用connection.Open()try 语句中对其进行测试。如果没有有效的连接,控制台应用程序应该尝试启动 MySQL 服务器并重试。

如何从DbContext 获取Connection

context.Connection 在 EF6 之前。 context.Database.Connection EF6 之后。

似乎最新版本也已从 EFCore 中删除。

【问题讨论】:

  • 在 EF Core 中有类似的东西 - dbContext.Database.OpenConnection()dbContext.Database.GetDbConnection() - 会有用吗?
  • 不,很遗憾没有。我看不到 context.Database.OpenConnection() 或 context.Database.GetConnection() 方法之类的东西,否则我会简单地调用它们。
  • 依赖项:“Microsoft.EntityFrameworkCore”:“1.0.0”,“MySql.Data.Core”:“7.0.4-IR-191”,“MySql.Data.EntityFrameworkCore”:“7.0 .4-IR-191"。
  • 谢谢。这解决了它!

标签: .net-core entity-framework-core


【解决方案1】:

Microsoft.EntityFrameworkCore.Relational (https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Relational/) 包为此提供了扩展方法 - 您可以使用 dbContext.Database.OpenConnection()dbContext.Database.GetDbConnection() 来获取 DbConnection 对象。

注意:如果你安装了Microsoft.EntityFrameworkCore.SqlServer,那么你不必显式安装这个包

【讨论】:

  • GetDbConnection() in 2.0
  • 确保包含扩展,这对我来说是个问题。 (使用 Microsoft.EntityFrameworkCore.Extensions;)
  • 我也很难找到这个。只需添加 using Microsoft.EntityFrameworkCore 声明即可。只要您的 nuget 部门中包含 Microsoft.EntityFrameworkCore.SqlServer 或 Microsoft.EntityFrameworkCore.Relational,您就应该会看到扩展方法。
  • GetDbConnection() 在数据库上第二次调用时失败。我正在使用 'using (var connection = _dbContext.Database.GetDbConnection()) {}' 块来调用一些命令。连接在 using 块中是打开和关闭的,但是当我第二次运行相同的方法时,我得到了错误的连接(ConnectionString 丢失,一些属性异常。是什么原因造成的?这个 .NET Core EF 错误的任何解决方法?跨度>
  • @RadekStrugalski 这可能是相关的:github.com/aspnet/EntityFrameworkCore/issues/7810
【解决方案2】:

您可以执行以下操作:

  1. 如果您使用 System.Data.SqlClient,请将其更改为 Microsoft.Data.SqlCLient,因为后面的库将接受来自 EntityFramework 和 EntityFrameWorkCore 中 DBContext 对象的显式转换。
  2. 从 DBContext 连接创建一个命令并将其转换为您的 SQLCommand by
using (SqlCommand cmd = (SqlCommand)database.GetDbConnection().CreateCommand())
  1. 检查连接状态,必要时打开。
if (cmd.Connection.State != ConnectionState.Open)
{
    cmd.Connection.Open();
}
  1. 如果 DBContext 中有事务,请将其添加到命令中。
if (database.CurrentTransaction != null)
{
    cmd.Transaction = database.CurrentTransaction.GetDbTransaction();
}

这样做可以避免在上下文之外使用命令时出现的任何问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 2018-07-22
    • 2020-05-16
    • 2020-10-15
    • 2016-11-08
    • 2017-10-01
    相关资源
    最近更新 更多