实体框架核心:如何从DbContext获取连接?

Nic*_*ada 22 entity-framework-core .net-core

我正在尝试使用MySQL Connector的新实体框架核心.

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

我需要得到ConnectionDbContext,因为我必须在应用程序来测试它使用开始connection.Open()一个内部try声明.如果没有有效连接,控制台应用程序应尝试启动MySQL服务器并重试.

我怎样才能获得ConnectionDbContext

在EF6之前context.Connection.经过EF6之后context.Database.Connection.

看起来最新版本也已从EFCore中删除.

Dev*_*per 35

Microsoft.EntityFrameworkCore.Relational(https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Relational/)封装提供了这种扩展方法-你可以使用dbContext.Database.OpenConnection()dbContext.Database.GetDbConnection()获取DbConnection对象.

注意:如果已Microsoft.EntityFrameworkCore.SqlServer安装,则无需显式安装此软件包

  • 在数据库上第二次调用GetDbConnection()时失败。我正在使用“使用(var connection = _dbContext.Database.GetDbConnection()){}”块来调用一些命令。连接在using块内处于“打开”和“关闭”状态,但是当我第二次运行相同的方法时,连接出现故障(ConnectionString丢失,某些属性异常。这是什么原因?此.NET Core EF错误的任何解决方法? (4认同)
  • 2.0 中的 GetDbConnection() (3认同)
  • 我也在努力寻找这个.只需添加一个`using Microsoft.EntityFrameworkCore`语句.只要您的nuget deps中包含Microsoft.EntityFrameworkCore.SqlServer或Microsoft.EntityFrameworkCore.Relational,您就应该看到扩展方法. (3认同)

Wae*_*een 16

您可以执行以下操作:

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

通过这样做,您将避免在上下文之外使用命令时出现的任何问题。