C# and EntityFramework: Using a DBContext in multiple projects

2 min read 06-10-2024
C# and EntityFramework: Using a DBContext in multiple projects


Sharing Your Database Connection: Using a DbContext in Multiple C# Projects

Ever found yourself needing to access the same database from different parts of your C# application? Maybe you have a web API project and a separate console application that both need to interact with your data. This is where the concept of sharing a DbContext across multiple projects comes in handy.

Let's break down the scenario and explore how to effectively leverage a DbContext in different parts of your C# solution.

The Problem:

Imagine you have a .NET solution with two projects:

  • MyAPI: A web API project that handles data requests.
  • MyConsoleApp: A console application for data processing.

Both projects need to interact with the same database, but using separate DbContext instances would lead to code duplication and potential inconsistencies.

The Solution:

The key is to create a separate project dedicated to your data access logic, including your DbContext. This project can then be referenced by both your API and console application.

Here's a basic code example:

1. Create a Data Access Project:

// Data.cs (in Data Access Project)
public class DataContext : DbContext
{
    public DbSet<MyEntity> MyEntities { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(
            "Server=(localdb)\\mssqllocaldb;Database=MyDatabase;Trusted_Connection=True;");
    }
}

// MyEntity.cs (in Data Access Project)
public class MyEntity 
{
    public int Id { get; set; }
    public string Name { get; set; }
}

2. Reference the Data Access Project:

In both the MyAPI and MyConsoleApp projects, add a reference to the Data Access Project.

3. Access the DbContext:

// In MyAPI.cs (MyAPI Project)
using Data;

public class MyApiController : ControllerBase
{
    private readonly DataContext _context;

    public MyApiController(DataContext context)
    {
        _context = context;
    }

    [HttpGet]
    public IActionResult GetEntities()
    {
        var entities = _context.MyEntities.ToList();
        return Ok(entities);
    }
}

// In MyConsoleApp.cs (MyConsoleApp Project)
using Data;

class Program
{
    static void Main(string[] args)
    {
        using (var context = new DataContext())
        {
            // Access your data through the context
            var myEntity = context.MyEntities.FirstOrDefault(e => e.Name == "Example");

            Console.WriteLine({{content}}quot;Found entity: {myEntity?.Name}");
        }
    }
}

Important Considerations:

  • Dependency Injection: Utilize dependency injection in your API and console application to inject the DataContext instance. This promotes code reusability and maintainability.
  • Connection String: Store your connection string securely, ideally in a configuration file or an environment variable.
  • Transactions: For operations involving multiple database changes, ensure you use transactions to maintain data integrity.
  • Database Migrations: Manage your database schema changes using Entity Framework migrations to keep your database synchronized with your code.

Benefits of Sharing a DbContext:

  • Code Reuse: Avoid duplicate database logic across projects.
  • Consistency: Ensure your data access code adheres to a single, well-defined structure.
  • Maintainability: Easier to update and maintain your database interactions across your application.

Additional Notes:

  • This approach allows you to centralize your database access logic, making it easier to manage and modify as your application grows.
  • The DataContext can be extended to include other entities and methods related to your database interaction.
  • Consider using a dedicated unit testing project to ensure your data access code functions correctly.

By following these guidelines, you can effectively leverage a DbContext across multiple C# projects, promoting code reuse, consistency, and maintainability in your database interactions.