C#의 Entity Framework Core(EF Core)에서 여러 개의 데이터베이스를 연결하는 가장 표준적이고 권장되는 방법은 데이터베이스마다 별도의 DbContext 클래스를 만드는 것입니다.
다음은 이를 구현하는 단계별 가이드입니다.
먼저, 연결하려는 각 데이터베이스의 연결 문자열을 설정 파일에 정의합니다.
{
"ConnectionStrings": {
"FirstDbConnection": "Server=localhost;Database=FirstDb;Trusted_Connection=True;",
"SecondDbConnection": "Server=localhost;Database=SecondDb;Trusted_Connection=True;"
}
}
각 데이터베이스에 대응하는 DbContext 클래스를 각각 작성합니다.
// 첫 번째 데이터베이스용 Context
public class FirstDbContext : DbContext
{
public FirstDbContext(DbContextOptions<FirstDbContext> options) : base(options) { }
public DbSet<User> Users { get; set; }
}
// 두 번째 데이터베이스용 Context
public class SecondDbContext : DbContext
{
public SecondDbContext(DbContextOptions<SecondDbContext> options) : base(options) { }
public DbSet<Product> Products { get; set; }
}
Program.cs (또는 .NET Core 이전 버전의 Startup.cs)에서 각 DbContext가 어떤 연결 문자열을 사용할지 설정합니다.
var builder = WebApplication.CreateBuilder(args);
// 첫 번째 DbContext 등록 (SQL Server 예시)
builder.Services.AddDbContext<FirstDbContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("FirstDbConnection")));
// 두 번째 DbContext 등록
builder.Services.AddDbContext<SecondDbContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("SecondDbConnection")));
의존성 주입(DI)을 통해 필요한 Context를 불러와서 사용합니다.
public class MyController : ControllerBase
{
private readonly FirstDbContext _firstDb;
private readonly SecondDbContext _secondDb;
public MyController(FirstDbContext firstDb, SecondDbContext secondDb)
{
_firstDb = firstDb;
_secondDb = secondDb;
}
[HttpGet]
public IActionResult GetData()
{
var users = _firstDb.Users.ToList();
var products = _secondDb.Products.ToList();
return Ok(new { users, products });
}
}
데이터베이스가 여러 개일 때는 마이그레이션을 실행할 때 어떤 Context를 대상으로 할지 명시해야 합니다.
Package Manager Console:
Add-Migration InitialCreate -Context FirstDbContext
Update-Database -Context FirstDbContext
Add-Migration InitialCreate -Context SecondDbContext
Update-Database -Context SecondDbContext
.NET CLI:
dotnet ef migrations add InitialCreate --context FirstDbContext
dotnet ef database update --context FirstDbContext
UseSqlServer() 대신 UseNpgsql() 등을 사용하면 됩니다.TransactionScope를 사용해야 할 수도 있습니다. (하지만 이는 성능 저하나 분산 트랜잭션 설정 이슈가 있을 수 있으므로 신중해야 합니다.)이 방식이 EF Core에서 멀티 DB를 관리하는 가장 깔끔하고 유지보수가 쉬운 방법입니다.