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

.Net CoreEntity Framework-Core

.Net Core Problem Overview


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.

.Net Core Solutions


Solution 1 - .Net Core

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 - .Net Core

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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionnico9TView Question on Stackoverflow
Solution 1 - .Net CoreDeveloperView Answer on Stackoverflow
Solution 2 - .Net CoreWael Galal El DeenView Answer on Stackoverflow