I am using the latest v6 of Entity Framework along with a UnitOfWork pattern. This has been fine on a server for the past few years.
I want to move to azure hosting and use SQLAzure, so started to migrate the app. However I have had a number of issues.
Firstly I kept getting this error intermittently
A transport-level error has occurred when receiving results from the server.
After some Googling, it seems this is common and you need to implement your own SqlAzureExecutionStrategy
- All seems fine. Until I then find out that it doesn't support initiated transactions!
I then stumbled on this blog post - Which outlines the exact problems and gives example code of how to fix issues (Or so I thought).
I have followed the post (As far as I'm aware) exactly. I have my dBconfiguration class setup and it's hitting it the SetExecutionStrategy on app start.
public class EfConfig : DbConfiguration
{
public EfConfig()
{
SetExecutionStrategy("System.Data.SqlClient", () => SuspendExecutionStrategy
? (IDbExecutionStrategy)new DefaultExecutionStrategy()
: new CustomSqlAzureExecutionStrategy());
}
public static bool SuspendExecutionStrategy
{
get { return (bool?)CallContext.LogicalGetData("SuspendExecutionStrategy") ?? false; }
set { CallContext.LogicalSetData("SuspendExecutionStrategy", value); }
}
}
Then I have a custom class as referenced above called 'CustomSqlAzureExecutionStrategy' which I have put below and have overridden the ShouldRetryOn method
public class CustomSqlAzureExecutionStrategy : SqlAzureExecutionStrategy
{
protected override bool ShouldRetryOn(Exception exception)
{
var shouldRetry = false;
var sqlException = exception as SqlException;
if (sqlException != null)
{
foreach (SqlError error in sqlException.Errors)
{
if (error.Number == -2)
{
shouldRetry = true;
}
}
}
shouldRetry = shouldRetry || base.ShouldRetryOn(exception);
return shouldRetry;
}
}
However, when I run my app I still get the same error I started with, but this time just pointing to the custom class?
The configured execution strategy 'CustomSqlAzureExecutionStrategy' does not support user initiated transactions.
Have I missed something obvious here? Or not understood something? Any help would be greatly appreciated.
Update
Typically... StackOverFlow rubber ducking. I actually read it properly and found that I need to manually set the SuspendExecutionStrategy
in my UnitOfWork (Before BeginTransaction and after Commit).
So I have this just before .BeginTransaction()
EfConfig.SuspendExecutionStrategy = true;
And this just after .Commit()
EfConfig.SuspendExecutionStrategy = false;
This allows me to run the application now, but I still (Rarely I might add) get the transient error message?
A transport-level error has occurred when receiving results from the server.