Entity Framework Core:如何从DbContext获取连接?

74

我正在尝试使用MySQL Connector来使用新的Entity Framework Core。

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

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

如何从DbContext获取Connection

在EF6之前是通过context.Connection,在EF6之后是通过context.Database.Connection。但好像在EFCore中也被删除了。


2
在EF Core中有类似于dbContext.Database.OpenConnection()dbContext.Database.GetDbConnection()这样的东西,那样会有用吗? - Developer
我在文档中看到过。但是如果我尝试硬编码并编译,我得到的是:“错误 CS1061:'DatabaseFacade'不包含“GetDbConnection”的定义,并且没有接受类型为'DatabaseFacade'的第一个参数的扩展方法“GetDbConnection”(您是否缺少使用指令或程序集引用?)”。 - nico9T
1
依赖项: "Microsoft.EntityFrameworkCore": "1.0.0", "MySql.Data.Core": "7.0.4-IR-191", "MySql.Data.EntityFrameworkCore": "7.0.4-IR-191"。 - nico9T
3
尝试安装此软件包 - https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Relational/ - Developer
1
谢谢。问题已解决! - nico9T
显示剩余4条评论
2个回答

105

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

注意:如果您已经安装了Microsoft.EntityFrameworkCore.SqlServer,那么就不需要显式安装此包。


3
2.0版本中的GetDbConnection()。 - John
1
确保包含扩展名,这是我的问题。(使用Microsoft.EntityFrameworkCore.Extensions;) - hurlbz
5
我也曾经遇到过这个问题。只需添加 using Microsoft.EntityFrameworkCore 语句即可。只要你的 nuget 依赖项中包含 Microsoft.EntityFrameworkCore.SqlServer 或 Microsoft.EntityFrameworkCore.Relational,那么你就可以看到扩展方法了。 - Steve Scheffler
5
在调用数据库时,当第二次调用GetDbConnection()方法时会失败。我使用'using(var connection = _dbContext.Database.GetDbConnection()) {}'块来执行一些命令。在using块内,连接会被打开和关闭,但是当我第二次运行相同的方法时,我得到了一个有缺陷的连接(ConnectionString丢失,某些属性异常)。这是怎么造成的?有没有解决这个.NET Core EF bug的方法? - Radek Strugalski
1
@RadekStrugalski 这可能与您有关:https://github.com/aspnet/EntityFrameworkCore/issues/7810 - David Wilson
显示剩余2条评论

15

您可以执行以下操作:

  1. 如果您正在使用System.Data.SqlClient,请将其更改为Microsoft.Data.SqlClient,因为后者的库将在EntityFramework和EntityFrameWorkCore中都接受从DBContext对象的显式转换。
  2. 从DBContext连接创建一个命令,并通过Cast将其转换为SQLCommand

您可以执行以下操作:

  1. 如果您正在使用System.Data.SqlClient,请将其更改为Microsoft.Data.SqlClient,因为后者的库将在EntityFramework和EntityFrameWorkCore中都接受从DBContext对象的显式转换。
  2. 从DBContext连接创建一个命令,并通过 Cast 将其转换为 SQLCommand
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();
}

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接