In order to avoid escalating transaction to DTC when using Entity Framework, the database connection has to be shared. However, sharing the connection string can be problematic when dealing with entities based on the Entity Framework ADO.Net Data Model (EDMX).
The DbContext
generated by Entity Framework does not expose a way to inject a simple database connection string. The underlying problem is that Entity Framework requires an Entity Connection String
that contains more information than a simple connection string.
However, it is possible to generate a custom EntityConnection
and inject it into the Entity Framework DbContext
instance, as shown here:
var entityBuilder = new EntityConnectionStringBuilder
{
Provider = "System.Data.SqlClient",
ProviderConnectionString = "the database connection string",
Metadata = "res://*/MySample.csdl|res://*/MySample.ssdl|res://*/MySample.msl"
};
var entityConn = new EntityConnection(entityBuilder.ToString());
using (var mySampleContainer = new MySampleContainer(entityConn))
{
// use the DbContext as required
}
In the snippet above the EntityConnectionStringBuilder
class is used to create a valid Entity Connection String
, which then enables a new EntityConnection
instance to be created.
Keep in mind that although the DbContext
generated by default by Entity Framework does not have a constructor that accepts an EntityConnection
as a parameter, since it is a partial class, that parameter can be added using the following snippet:
partial class MySampleContainer
{
public MySampleContainer(EntityConnection dbConnection)
: base(dbConnection, true)
{
}
}
MySample
. The references should match the names used in the project.