Search  
Always will be ready notify the world about expectations as easy as possible: job change page
Aug 29, 2024

Multiple database provider migrations in Entity Framework

Multiple database provider migrations in Entity Framework
Source:
Views:
3209
Multiple database provider migrations in Entity Framework favorites 0

In some scenarios, we need to use different database providers for development and production environments. For instance, consider a scenario where we use SQLite in the development environment and SQL Server for the production environment.

This article will guide us through creating migrations for multiple database providers in Entity Framework.

Install Entity Framework packages

The first step is to ensure we have all the necessary packages installed. We’ll be focusing on utilising both SQLite and SQL Server providers. We need to install specific packages from the NuGet package library:

  1. Microsoft.EntityFrameworkCore.SqlServer
  2. Microsoft.EntityFrameworkCore.Sqlite
  3. Microsoft.EntityFrameworkCore.Tools

Entity Framework Packages

Creating a model class

The next step is creating a model class as a blueprint for a database table. For demonstration purposes, we will create a Person class. This class will be mapped to a corresponding Person table in the database.

public class Person
{
    public Guid Id { get; set; }
    public string? FirstName { get; set; }
    public string? LastName { get; set; }
    public DateOnly BirthDate { get; set; }
}

Creating Data Context

Initially, we start by constructing a base DataContext. This class serves as a repository for the DbSet properties corresponding to each of our models.

public class DataContext : DbContext
{
    public DbSet<Person> Person { get; set; }

    // Other properties...
}

Next, our task is to create a dedicated data context class for each database provider, which inherits from the base DataContext class.

Data Context for Sqlite:

public class SqliteDataContext(IConfiguration configuration) : DataContext
{
    private readonly IConfiguration _configuration = configuration;

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlite(_configuration.GetConnectionString("Sqlite"));
    }
}

Data Context for Sql Server:

public class SqlServerDataContext(IConfiguration configuration) : DataContext
{
    private readonly IConfiguration _configuration = configuration;

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(_configuration.GetConnectionString("SqlServer"));
    }
}

In each database-specific data context class, we need to inject the IConfiguration. This lets us easily get the connection string for the particular database we’re working with.

Then, we override the OnConfiguring method. This method sets up which database provider to use and provides the connection string. We get this connection string from IConfiguration. This setup ensures each database has the correct settings to connect and work properly with our application.

Configure connection strings

We need to set up the connection strings for each database provider. This is easily done in the appsettings.json file of our application.

{
  "ConnectionStrings": {
    "Provider": "Sqlite",
    "SqlServer": "Data Source=localhost;Initial Catalog=EFMultipleMigration;Integrated Security=True",
    "Sqlite": "Data Source=EFMultipleMigration.db"
  }
}

Next, we need to register the data context in our application based on the provider we have configured in the appsettings.json file. To do this, go to the Program.cs file and add the code below:

switch (builder.Configuration.GetConnectionString("Provider"))
{
    case "SqlServer":
        builder.Services.AddDbContext<DataContext, SqlServerDataContext>();
        break;
    case "Sqlite":
        builder.Services.AddDbContext<DataContext, SqliteDataContext>();
        break;
}

The code above checks the “Provider” value in the appsettings.json configuration and then decides whether to use the SqlServerDataContext or SqliteDataContext.

  • If the provider is “SqlServer”, it uses SqlServerDataContext.
  • If it’s “Sqlite”, it uses SqliteDataContext.

Creating the migrations

Now, let’s add migrations for each database provider. Open the Package Manager Console and use the following commands.

First, we create an initial migration for Sqlite:

Add-Migration Initial -Context SqliteDataContext -OutputDir Databases/Migrations/Sqlite

The command above will generate an ‘Initial’ migration for SQLite. This migration will be placed in the ‘Databases/Migrations/Sqlite’ directory.

We can run the command below to add the Initial migration for SQL Server:

Add-Migration Initial -Context SqlServerDataContext -OutputDir Databases/Migrations/SqlServer

Migrations

Run the migration

To run the migration manually, we can execute the command below:

Update-Database -Context SqliteDataContext

The command above will perform the migration for the SQLite database.

We can change the Context value to SqlServerDataContext to run the SQL Server migrations:

Update-Database -Context SqlServerDataContext

We can also add the following code to the Program.cs file to run the migration automatically every time the application starts:

var scope = app.Services.CreateScope();
var dataContext = scope.ServiceProvider.GetRequiredService<DataContext>();
dataContext.Database.Migrate();

• • •

The complete source code of this article can be found here:
GitHub - juldhais/EFMultipleMigration: Entity Framework Multiple Migration Example

Thank you for reading. 👍

Similar
Jan 27
Author: Bhushan Kadam
Introduction Docker is a popular platform for building and deploying applications using containers. Containers allow you to package your application and its dependencies into a single, portable unit, making it easy to deploy and run your application on any machine...
Jun 27, 2024
Author: Dayanand Thombare
Introduction Caching is a technique used to store frequently accessed data in a fast-access storage layer to improve application performance and reduce the load on backend systems. By serving data from the cache, we can avoid expensive database queries or...
Sep 30, 2024
Author: YogeshKumar Hadiya
Introduction Azure Service Bus is a messaging service provided by Microsoft Azure that allows communication between applications and services. It provides a reliable and scalable platform for sending and receiving messages asynchronously. Whether you’re building a simple application or a...
Sep 12, 2024
Author: Bubu Tripathy
Data consistency in a Spring Boot application Concurrent database updates refer to situations in which multiple users or processes attempt to modify the same database record or data concurrently, at the same time or in rapid succession. In a multi-user...
Send message
Type
Email
Your name
*Message