티스토리 뷰

반응형

전통적으로 Database에 접근해서 데이터를 조작하기 위한 기술은 OLE DB and ActiveX Data Objects(ADO), Open Database Connectivity(ODBC), Remote Data Objects(RDO), Data Access Objects (DAO)와 같은 것들이 있습니다. 그러나 이 기술들은 이런 기술이 가지고 있는 가장 큰 문제점인 O/RM(Object-Relational Mapping) 처리를 하지 못했습니다. 즉, 데이터베이스 테이블에 있는 데이터를 객체 지향 프로그래밍 언어로 변화하는 작업을 개발자가 모두 처리해야 했기 때문에 개발 시간과 유지보수적인 측면에서 문제가 있었습니다.

 

Visual Studio 2008과 NET Framework 3.0은 LINQ to SQL과 Entity Framework의 두 가지 데이터베이스 솔루션을 시작하면서 데이터 조작을위한 O/RM 환경을 제공하기 시작했으며, Visual Studio 2010에서 Entity Framework 4에서 더욱더 개선된 서비스를 제공하며, 지금까지도 계속 발전을 하고 있습니다.

 

Entity Framework Core는 Entity Framework 데이터 액세스 기술의 가볍고 확장 가능한 오픈 소스 및 크로스 플랫폼 버전입니다.

 

EF Core는 다음과 같은 O/RM(object-relational mapper)역할을 할 수 있습니다.

  • .NET 개발자가 .NET 객체를 사용하여 데이터베이스로 작업 할 수 있습니다.
  • 일반적으로 작성해야하는 대부분의 데이터 액세스 코드가 필요하지 않습니다.

한글 Entity Framework Core에 대한 설명은 여기를 참고하세요.

한글 Entity Framework Core에 대한 단계별 튜토리얼은 여기를 참고하세요.

 

youtu.be/PpqdsJDvcxY

Getting Started with Entity Framework Core 시리즈가 간결하게 설명이 잘 되어있어서 동영상의 내용을 이용하도록 하겠습니다. 이 동영상은 Entity Framework Core 3.0을 기준으로 만들어져있습니다.

 

셈플은 아래와 같은 관계형을 이용하도록 합니다.

 

콘솔앱을 생성합니다.

Console App(.NET Core), Project name : ContosoPets

생성된 프로젝트의 속성 페이지를 확인하면 정확한 버전을 알 수 있습니다. 여기서는 .NET Core 3.1로 작업을 하도록 하겠습니다. 최신버전은 .NET 5.0입니다.

 

NuGet package를 추가합니다.

microsoft.entityframeworkcore로 검색을 합니다.

Microsoft.EntityFrameworkCore.SqlServer, Microsoft.EntityFrameworkCore.Design, Microsoft.EntityFrameworkCore.Tools 패키지를 설치합니다.

설치할 때 버전을 3.1.10으로 변경하신 후 설치하시기 바랍니다.

 

Models 폴더를 추가합니다.

Product, Customer, Orders, ProductOrders class를 추가합니다.

//using과 namespace는 생략. 4개의 파일 내용입니다.
    public class Customer
    {
#nullable enable
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string? Address { get; set; }
        public string? Phone { get; set; }
#nullable disable
        public ICollection<Order> Orders { get; set; }
    }

    public class Order
    {
        public int Id { get; set; }
        public DateTime OrderPlaced { get; set; }
        public DateTime? OrderFulfilled { get; set; }
        public int CustomerId { get; set; }

        public Customer Customer { get; set; }
        public ICollection<ProductOrder> ProductOrders { get; set; }
    }

    public class Product
    {
        public int Id { get; set; }

        [Required]
        public string Name { get; set; }
        [Column(TypeName = "decimal(18, 2)")]
        public decimal Price { get; set; }
    }
    
        public class ProductOrder
    {
        public int Id { get; set; }
        public int Quantity { get; set; }
        public int ProductId { get; set; }
        public int OrderId { get; set; }

        public Order Order { get; set; }
        public Product Product { get; set; }
    }

Data 폴더를 추가합니다.

ContosoPetsContext class를 추가합니다.

    public class ContosoPetsContext : DbContext
    {
        public DbSet<Customer> Customers { get; set; }
        public DbSet<Order> Orders { get; set; }
        public DbSet<Product> Products { get; set; }
        public DbSet<ProductOrder> ProductOrders { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            //셈플이기 때문에 여기에 connection string을 입력
            optionsBuilder.UseSqlServer("Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=ContosoPets;Integrated Security=true");
        }
    }
참고 : LocalDB 설치 방법
  • Visual Studio Installer에서  Data Storage and Processing workload 선택 후 설치
  • ASP.NET and web development workload
  • 개별 콤포넌트 설치

더 자세한 사항은 여기를 참고합니다.

 

첫번째 마이그레이션을 생성

.NET Core CLI를 이용하는 방법은 여기를 참고합니다.

Package Manager Console

Add-Migration InitialCreate

마이그레이션 실행

Update-Database

 

생성된 Database 확인

View, SQL Server Object Explorer 선택

Customers 테이블의 스키마를 확인합니다.

맨 처음 관계도를 확인하면 Customers 테이블에 Email 컬럼이 누락된 것을 확인할 수 있습니다.

Email 프로퍼티를 Customer 클래스에 추가

    public class Customer
    {
#nullable enable
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string? Address { get; set; }
        public string? Phone { get; set; }
        public string Email { get; set; }
#nullable disable

        public ICollection<Order> Orders { get; set; }
    }

두번째 마이그레이션 생성

Add-Migration AddEmail

마이그레이션 실행

Update-Database

Customers 테이블의 스키마 확인(ContosoPets Database Refresh 후 진행)

Email 컬럼이 추가된 것을 확인할 수 있습니다.

 

데이터 추가하기

. 테이블을 직접 지정 하는 방법 : context.Products.Add();

. 데이터를 추가하면 해당 데이터를 사용하는 테이블에 자동으로 추가되는 방법 : context.Add();

    class Program
    {
        static void Main(string[] args)
        {
            using ContosoPetsContext context = new ContosoPetsContext();

            Product squeakyBone = new Product() 
            {
                Name = "Squeaky Dog Bone",
                Price = 4.99M
            };
            //레코드 추가 방법1
            context.Products.Add(squeakyBone);

            Product tennisBalls = new Product()
            {
                Name = "Tennis Ball 3-Pack",
                Price = 9.99M
            };
            //레코드 추가 방법2
            context.Add(tennisBalls);

            context.SaveChanges();
        }
    }

코드를 입력 후 실행하고 결과를 확인합니다.

 

데이터 조회하기

Lambda Expressions

            var products = context.Products
                .Where(p => p.Price >= 5.00M)
                .OrderBy(p => p.Name);

LINQ

            var products = from p in context.Products
                           where p.Price >= 5.00M
                           orderby p.Name
                           select p;

위의 두가지 방식을 이용해서 데이터를 조회할 수 있습니다.

            foreach (var p in products)
            {
                Console.WriteLine($"Id:      {p.Id}");
                Console.WriteLine($"Name:    {p.Name}");
                Console.WriteLine($"Price:   {p.Price}");
                Console.WriteLine(new string('-', 20));
            }

실행해서 결과를 출력합니다.

 

데이터 수정하기

        static void Main(string[] args)
        {
            using ContosoPetsContext context = new ContosoPetsContext();
            //데이터 1개 반환
            var squeakyBone = context.Products
                                .Where(p => p.Name == "Squeaky Dog Bone")
                                .FirstOrDefault();
            if(squeakyBone is Product)
            {
                //값 변경
                squeakyBone.Price = 7.99m;
            }
            //저장
            context.SaveChanges();

            var products = from p in context.Products
                           where p.Price >= 5.00M
                           orderby p.Name
                           select p;

            foreach (var p in products)
            {
                Console.WriteLine($"Id:      {p.Id}");
                Console.WriteLine($"Name:    {p.Name}");
                Console.WriteLine($"Price:   {p.Price}");
                Console.WriteLine(new string('-', 20));
            }
        }

실행 후 결과를 확인합니다.

 

데이터 삭제

        static void Main(string[] args)
        {
            using ContosoPetsContext context = new ContosoPetsContext();

            //데이터 1개 조회
            var squeakyBone = context.Products
                                .Where(p => p.Name == "Squeaky Dog Bone")
                                .FirstOrDefault();
            if(squeakyBone is Product)
            {
                //삭제
                context.Remove(squeakyBone);
            }
            //데이터베이스에 반영
            context.SaveChanges();

            var products = from p in context.Products
                           where p.Price >= 5.00M
                           orderby p.Name
                           select p;

            foreach (var p in products)
            {
                Console.WriteLine($"Id:      {p.Id}");
                Console.WriteLine($"Name:    {p.Name}");
                Console.WriteLine($"Price:   {p.Price}");
                Console.WriteLine(new string('-', 20));
            }
        }

실행 후 결과를 확인합니다.

 

Entity Framework Core를 이용하면 이렇게 간단하게 CRUD 작업을 할 수 있습니다.

 

반응형

'Entity Framework Core' 카테고리의 다른 글

SQL Sever Express vs SQLite  (0) 2020.12.27
Entity Framework Core 시작(2/5)  (2) 2020.12.19
Entity Framework Core 링크 정리  (0) 2020.12.14
Announcing the Release of EF Core 5.0  (0) 2020.12.10
Blazor?  (0) 2019.06.20
댓글