Entity Framework Core: How to get the Connection from the DbContext?

52,306

Solution 1

The Microsoft.EntityFrameworkCore.Relational (https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Relational/) package provides extension methods for this - you can use dbContext.Database.OpenConnection() or dbContext.Database.GetDbConnection() to get the DbConnection object.

Note: if you have Microsoft.EntityFrameworkCore.SqlServer installed then you don't have to explicitly install this package

Solution 2

You can do the following :

  1. If you are using System.Data.SqlClient change it to Microsoft.Data.SqlCLient since the later library will accept excplicit casting from the object of the DBContext in both EntityFramework and EntityFrameWorkCore.
  2. Create a command from the DBContext connection and Cast it to your SQLCommand by
using (SqlCommand cmd = (SqlCommand)database.GetDbConnection().CreateCommand())
  1. Check the connection state and open it if necessary.
if (cmd.Connection.State != ConnectionState.Open)
{
    cmd.Connection.Open();
}
  1. If there is a transaction in the DBContext add it to the command.
if (database.CurrentTransaction != null)
{
    cmd.Transaction = database.CurrentTransaction.GetDbTransaction();
}

By doing this you will avoid any problems can appear when using comands outside the context.

Share:
52,306
nico9T
Author by

nico9T

Updated on July 17, 2021

Comments

  • nico9T
    nico9T almost 3 years

    I am trying the new Entity Framework Core with MySQL Connector.

    I can get a valid DbContext and write into the database so everything has been setup correctly.

    I need to get the Connection from the DbContext because I have to test for it at application starting using a connection.Open() inside a try statement. If there is not a valid connection, the console app should try to start MySQL Server and retry.

    How can I get the Connection from the DbContext?

    Before EF6 by context.Connection. After EF6 by context.Database.Connection.

    It seems the latest has been removed too from EFCore.