Skip to main content

Entity Framework Internals: Connection Resiliency

When you use cloud services to deploy your application and database it might be possible that transient connection will be a problem between database server and web servers. When you use on premise servers that uses the database server and web server on same data centre. When you use cloud there will be huge infrastructures and you never know where it is deployed even if it deployed on same data centre there will more connection like network load balancers etc. When you use cloud services that will be shared by lots of users which means its responsiveness can be affected by them. And your access to the database might be subject to throttling. Throttling means the database service throws exceptions when you try to access it more frequently than is allowed in your Service Level Agreement (SLA).

So in cloud service there will be transient problems which will be resolved in short period of time. So when you got such kind of errors then you can wait for some time and then you have retry. For that kind of operation Entity Framework provides connection resiliency feature.

The connection resiliency features must be configured for proper database services. It has to know which exceptions are likely to be transient problem and which exceptions are caused by our code. It has to wait for an appropriate amount of time between retries of failed operation. Also it has to try number of times before giving up.

Enough theory let’s see how we can use that feature with SQL Azure with Entity Framework. I’m going to create a small console application for the same.

connection-resiliency-entity-framework

and I have added Entity framework via nuget pacakge.

connection-resiliency-entity-framework-nuget-package

Now it’s time to create SQL Azure on Window Azure. So login into windows azure portal and go to data-storage part.

creating-sql-database-azure

Once you click on it it will ask for Server creation.

sql-server-creating-azure

Once you are done with it. It will ask for database creation.

provisiniong-sql-database-azure

After doing this, It will take some time to create database. Now if you want to access this database with local SQL Server and local application you need to create firewall settings. So find your ip and allow this IP in firewall settings like below.

firewall-settings-azure

Once you are done with it. You are now able to connection to SQL Azure database with your SQL Server management studio. So We are all set to write some code. Here is the Employee class I have created.
namespace EFConnectionResiliency
{
    public class Employee
    {
        public int EmployeeId { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string  Designation { get; set; }
    }
}
As we all know Entity Framework provides Connection Resiliency features it provides DbConfiguration class from where you can create your own configuration based on your cloud services you are using. So in our case we are using SQL Azure so I have created my EmployeeConfiguration class like below.
using System.Data.Entity;
using System.Data.Entity.SqlServer;

namespace EFConnectionResiliency
{
    public class EmployeeConfiguration : DbConfiguration
    {
        public EmployeeConfiguration()
        {
            SetExecutionStrategy("System.Data.SqlClient", () => new SqlAzureExecutionStrategy());
        }
    }
}
So in above code if you see that, I have set execution Strategy to SQL Azure as I have used SQL Azure in this example.  Now it’s time to write our data context class. There are multiple way you can tell your datacontext class to use this configuration and easiest way of doing this is to use DbConfigurationType Attribute like below.
using System.Data.Entity;

namespace EFConnectionResiliency
{
    [DbConfigurationType(typeof(EmployeeConfiguration))] 
    public class EmployeeContext : DbContext
    {
        public EmployeeContext(): base("DefaultConnectionString")
        {
            // public constructor to use connection string
        }
        public DbSet<Employee> Employees { get; set; } 
    }
}
And here is the code for the my console application.
using System;

namespace EFConnectionResiliency
{
    class Program
    {
        static void Main(string[] args)
        {
            Employee employee = new Employee
            {
                FirstName = "Jalpesh",
                LastName = "Vadgama",
                Designation = "Project Manager"
            };

            using (EmployeeContext employeeContext = new EmployeeContext())
            {
                employeeContext.Employees.Add(employee);
                employeeContext.SaveChanges();
            }

            Console.WriteLine("Employee Created");
        }
    }
}
Now when you run this, following is output as expected.

employee-sucessfully-created

And when you connection your SQL Azure database in your SQL management studio and see employee table is created like below.

employee-table-created-sql-azure

And here’s how data is inserted.

data-sql-azure-database

So it is very easy to use Connection Resiliency feature with Entity Framework. That’s it. Hope you like Stay tuned for more!
You can find complete source code for example on following location- https://github.com/dotnetjalps/EFConnectionResiliency

Comments

Popular posts from this blog

How to create Rest API(Web API) with ASP.NET Core 1.0

Recently Microsoft has released ASP.NET Core 1.0 RC2, I am getting lots of request from readers that about creating Web API. So I thought it will be a good idea to write a blog post about how to create Rest API(Web API) with ASP.NET Core 1.0.

So let’s get started via creating an ASP.NET Core 1.0 Web Application like following.



Once you click on ASP.NET Web Application, It will ask whether you need to create Web Application or Web API application. We are going to Web API so I am going to select Web API Application like following. Please note that in ASP.NET Core 1.0 there is no separate libraries or DLLs required for creating web APIs. This is just a project template.



Now once you click on OK It will create a Web API application with default values controller and program.cs.  As you know Program.cs is now starting point for the ASP.NET Core 1.0 application so It contains all the required configuration and startup items. Following is a code for that.
using System.IO; using Microsoft.Asp…

How to use migration with Entity Framework Core

Entity framework core is  the lightweight, extensible and cross-platform version of Entity Framework. Before some time, Microsoft has Released a new version of Entity Framework RC2. I have written a couple of blog post about Entity framework code first migration earlier for Entity framework 6.0. So there was a couple of request coming for writing a blog post about Entity Framework Core RC2 migration. So I thought it will be a good idea to give an overview how database migration works in Entity Framework Core RC2. This post will cover a basic scenario where we are going to create the database with existing ASP.NET Identity migration and then we are going to create a new model and have that migration applied in the database.

How to use Entity Framework Migrations: Let’s get started, To demonstrate entity framework core migrations, I am going to create a sample asp.net core web application like following.



Once we select asp.net core application it will appear the following dialog.



Now w…

Solution: gulp is not recognized as internal or external command- Visual Studio

Recently, After Upgrading to the newer version of Gulp, I was getting this error.  After doing lots of  finding online and in my system I was able to figure out that Modules like Gulp does not installed to the path. So when you try to run it from the command line it was showing below error.
gulp is not recognized as internal or external command How to solve : gulp is not recognized as internal or external command To solve this error we just need to create a new environment variable and set the NPM modules path there.

To create an environment variable,  Right click My Computer/ This Pc and click on properties.  It will open following windows.



Go to Advance System Settings and it will open system properties windows like below.



Click on Environment Variables it will open an environment and system variables windows like below.



Click on new System variable and put NODE_PATH in system variable name and %AppData%\npm\node_modules into the variable value like below.



Click on Ok. That’s it. N…