이번글에서는 .NetCore , .NET 에서 MYSQL 접속하여 데이터를 가져오고 화면에 표시하는 법을 알아보도록 하겠습니다. 아쉽게도 .Net 프로그래밍에서는 Oracle에서 제공하는 확장 프로그램인 UI(ADO.NET 엔티티 데이터 모델)는 제공하지 않습니다.
C# 에서 간단히 콘솔 프로그램으로 만들어 콘솔창에 DB 내용을 보여주는 예제를 보여드리도록 하겠습니다.
DB 구조
먼저 MYSQL DB 구조를 보겠습니다. 이번글에서는 DB First 즉 DB 먼저 생성하고 .Net 프로그래밍으로 MYSQL 에 접속해서 데이터를 읽고 쓰는 방법에 대해 알아볼것입니다.
MYSQL 에서 DB 구조가 어떻게 되어 있는지 먼저 보겠습니다. 일단 DB 접속 프로그램으로는 HeidiSQL 를 사용 하였습니다. 툴은 다음 위치에서 다운 받을 수 있습니다.
HeidiSQL – MariaDB, MySQL, MSSQL, PostgreSQL and SQLite made easy
다음은 제가 사용한 DB 구조 입니다.
![[C#] .NET 에서 MYSQL 접속하기 : entityframework 사용 1 [C#] .NET 에서 MYSQL 접속하기 : entityframework 사용](https://i0.wp.com/harostudio.co.kr/wp-content/uploads/2023/11/AC_20231127-092849.png?resize=779%2C679&ssl=1)
위와 같이 Sakila 데이터베이스에서 actor 라는 테이블의 데이터를 읽어보도록 하겠습니다.
Entity Framework Core를 활용한 기존 데이터베이스 모델링
EF Core와 데이터베이스 모델
EF Core는 이전 버전인 EF 6과 달리 엔터티 및 컨텍스트 클래스를 만드는 데 DB 모델 또는 비주얼 디자이너를 지원하지 않습니다. 이에 따라 명령어를 활용하여 리버스 엔지니어링을 수행해야 합니다. 리버스 엔지니어링 명령어는 기존 데이터베이스의 스키마를 기반으로 엔터티 및 컨텍스트 클래스(파생)를 생성합니다.
Scaffold-DbContext를 활용한 클래스 생성
MS SQL Server의 로컬 데이터베이스에서 SchoolDB 데이터베이스에 대한 엔터티 및 컨텍스트 클래스를 생성해 보겠습니다. Scaffold-DbContext 명령어를 통해 데이터베이스와 연결된 클래스를 자동으로 생성할 수 있습니다.
프로젝트 생성
이제 실전으로 들어갑니다.
비쥬얼 스튜디오를 실행하고 테스트로 C# 콘솔앱을 하나 만들겠습니다. 저는 .Net 7.0 으로 만들겠습니다.
프로젝트 명을 TestMySql 로 정해주었습니다.
NuGet에서 다음 패키지를 설치해야 합니다.
Microsoft.EntityFrameworkCore.Design
Microsoft.EntityFrameworkCore.Tools
Pomelo.EntityFrameworkCore.MySql
.Net 7.0 기준으로 만들어졌으므로 패키지들도 7.~ 대 버전을 패키지를 설치 하였습니다.
![[C#] .NET 에서 MYSQL 접속하기 : entityframework 사용 2 [C#] .NET 에서 MYSQL 접속하기 : entityframework 사용](https://i0.wp.com/harostudio.co.kr/wp-content/uploads/2023/11/AC_20231127-093100.png?resize=840%2C265&ssl=1)
모델생성
Scaffold-DbContext 명령
Scaffold-DbContext
명령어는 기존 데이터베이스를 기반으로 모델을 만드는 데 사용합니다. 패키지 관리자 콘솔에서 Scaffold-DbContext를 사용하여 지정할 수 있는 매개 변수는 다음과 같습니다.
Scaffold-DbContext [-Connection] [-Provider] [-OutputDir]
[-Context] [-Schemas>] [-Tables>]
[-DataAnnotations] [-Force] [-Project]
[-StartupProject] [<CommonParameters>]
위의 규칙을 읽어보시고 제 DB 에서 모델을 생성하도록 하겠습니다. 패키지 관리자 콘솔을 열어줍니다.
다음과 같이 타이핑 합니다.
Scaffold-DbContext “data source=192.168.56.102,3306;Initial Catalog=sakila;user id=test;password=1234” Pomelo.EntityFrameworkCore.MySql -outputdir Models -context sakilaContext -contextdir Models -DataAnnotations -Force -Tables actor
이 명령어는 제 DB 이며 파랗게 칠한 부분을 환경에 맞게 바꿔 주시면 됩니다.
![[C#] .NET 에서 MYSQL 접속하기 : entityframework 사용 3 [C#] .NET 에서 MYSQL 접속하기 : entityframework 사용](https://i0.wp.com/harostudio.co.kr/wp-content/uploads/2023/11/AC_20231127-093506.png?resize=703%2C418&ssl=1)
그러면 위와 같이 Models라는 폴더에 모델이 생성된것이 보입니다.
생성된 모델을 한번 볼께요..
sakilaContext.cs
using System;
using System.Collections.Generic;
using Microsoft.EntityFrameworkCore;
namespace TestMySql.Models;
public partial class sakilaContext : DbContext
{
public sakilaContext()
{
}
public sakilaContext(DbContextOptions<sakilaContext> options)
: base(options)
{
}
public virtual DbSet<Actor> Actors { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder.UseMySql(
"data source=192.168.56.102,3306;initial catalog=sakila;user id=test;password=1234",
Microsoft.EntityFrameworkCore.ServerVersion.Parse("5.6.34-mysql"));
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder
.UseCollation("utf8_general_ci")
.HasCharSet("utf8");
modelBuilder.Entity<Actor>(entity =>
{
entity.HasKey(e => e.ActorId).HasName("PRIMARY");
entity.Property(e => e.LastUpdate)
.ValueGeneratedOnAddOrUpdate()
.HasDefaultValueSql("CURRENT_TIMESTAMP");
});
OnModelCreatingPartial(modelBuilder);
}
partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
}
actor.cs
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
namespace TestMySql.Models;
[Table("actor")]
[Index("LastName", Name = "idx_actor_last_name")]
public partial class Actor
{
[Key]
[Column("actor_id", TypeName = "smallint(5) unsigned")]
public ushort ActorId { get; set; }
[Column("first_name")]
[StringLength(45)]
public string FirstName { get; set; } = null!;
[Column("last_name")]
[StringLength(45)]
public string LastName { get; set; } = null!;
[Column("last_update", TypeName = "timestamp")]
public DateTime LastUpdate { get; set; }
}
위와 같이 접속 정보와 모델이 자동을 구성 되었습니다.
데이터 가져오기
Program.cs 에서 다음처럼 코딩후 실행 시켜 보겠습니다.
Actor Table 에서 모든 데이터를 표시해보겠습니다.
using TestMySql.Models;
namespace TestMySql
{
internal class Program
{
static void Main(string[] args)
{
using (var context = new sakilaContext())
{
foreach (var row in context.Actors)
{
Console.WriteLine(
$"ActorId : {row.ActorId} " +
$"FirstName : {row.FirstName}" +
$"LastName : {row.LastName}");
}
Console.WriteLine(
$"총 {context.Actors.Count()} 개 가 출력되었습니다.");
}
}
}
}
실행 시키면 다음과 같이 실행 됩니다.
![[C#] .NET 에서 MYSQL 접속하기 : entityframework 사용 4 [C#] .NET 에서 MYSQL 접속하기 : entityframework 사용](https://i0.wp.com/harostudio.co.kr/wp-content/uploads/2023/11/AC_20231127-094229.png?resize=752%2C439&ssl=1)
위에서처럼 Online 으로 MySql 의 DB 를 모두 가져오는 예제를 살펴 보았습니다.
결론
.Net 에서 EntityFramework으로 MYSQL DB를 아주 쉽게 컨트롤 하는 방법을 배웠습니다.
DB 연결은 이렇게 쉽게 구성하였으니 EntityFrameWork 을 사용하여 Web 서버 또는 WPF 같은 UI 프로그램에서도 쉽게 접근하고 개발할 수 있습니다.