본문 바로가기
Entity Framework Core

ASP.NET Core] Entity Framework Core란?

by Fastlane 2023. 5. 23.
728x90
반응형

modern data의 이해

데이터 저장에 아래의 2가지 종류의 DB가 가장 흔하게 사용된다. 

Relational Database Management System(RDBMS) : Microsoft SQL Server, PostgreSQL, MySQL, SQLite

NoSQL : Microsoft Azure Cosmos DB, Redis, MongoDB, Apache Cassandra

 

Legacy Entity Framework의 이해

EF는 2008년도에 .NET Framework 3.5의 일부분으로 처음 배포되었다. MS는 어떻게 개발자들이 ORM을 사용하는지 관찰해왔다. ORM은 classes의 properties와 tables의 columns을 연결하여, 개발자가 DB에 상관없이 친숙한 objects를 사용하여 데이터처리를 하도록 도왔다. 

 

EF 6.3은 나중에 별도의 Package로 .NET Framework에서 분리되어 .NET Core 3.0과 상위버전을 지원할 수 있게 되었다. 따라서 cross-platform을 지원한다. 하지만 기존 EF6는 한계가 있어, cross-platform에서 구동될때 약간의 제한이 있다. 

 

.NET Core 3.0이나 상위버전의 프로젝트에서 legacy Entity Framework를 사용하려면 package reference를 추가해야 한다.

Entity Framework Core란?

.NET 소스코드를 통해서 database와 작업을 할 수 있도록 도와주는 object-relational mapper(ORM) 이다. 

가볍고, cross-platform, 오픈소스이며 기존 소스와 integrate하기 쉽다.

 

완벽한 cross-platform 버전은 EF Core이다. 비록 기존 EF와 이름은 비슷하지만, EF6와는 많이 다르다. 최신 EF Core는 버전 6.0이며 .NET 6.0버전과 매칭된다. 

 

EF Core 3.0과 상위버전은 .NET Framework 4.8과 같은 .NET Standard 2.0을 지원하지 않는다. EF Core는 RDBMS, modern cloud-based, nonrelational, schemaless data store를 지원한다. 

EF Core를 다루는 2가지 접근방식

  1. Database First : database가 이미 존재하고, 그 구조와 features에 맞는 model을 구성한다. 
  2. Code First : database가 존재하지 않고, model을 만들고 그 다음에, EF Core를 사용해서 구조와 features에 맞는 database를 생성한다.

Database providers

EF Core는 database providers라 불리는 plug-in libraries를 통해 다양한 database에 접속할 수 있다. 

현재 제공하는 providers는 아래 링크에서 확인 가능하다. 

https://learn.microsoft.com/en-us/ef/core/providers/?tabs=dotnet-core-cli 

Entities – The Classes That Map to the Database

model (entity) class는 EF Core가 database table과 mapping하기 위해 사용하는 class이다. 모든 public properties는 테이블의 컬럼과 동일한 이름으로 매핑된다.

DbContext란?

context class는 DbContext base class를 상속받아, database 접속에 대한 정보와 구성을 담고 있다. 이 class는 database와 communicate하고, 동적으로 SQL statements를 만든다.

 

EF Core는 application의 context class에 있는 모든 public DbSet properties를 찾아서, 동일한 이름의 db table과 매핑한다. 그 다음, DbSet<T> property 내부의 모든 public properties와 같은 이름, 타입을 갖는 db table column을 찾아서 매핑한다. 

 

entity class가 다른 class와 reference를 갖으면 EF Core는 reference properties를 사용해서 db에서 relationship을 생성한다. 

DbContext 등록

builder.Services.AddDbContext<AppDbContext>(option => option.UseSqlServer(
    builder.Configuration.GetConnectionString("DefaultConnection")
    ));

AddDbContext extension method를 사용해서 AppDbContext class를 IOC container에 등록한다. 

이제 context class를 DI와 함께 사용할 수 있다. 

public class ValuesController : ControllerBase
{
    private readonly ApplicationContext _context;
    public ValuesController(ApplicationContext context)
    {
        _context = context;
    }
    [HttpGet]
    public IActionResult Get()
    {
        //Logic with the injected _context object.
    }
}

DbContext class definition에는 아래 세가지 properties가 있다. 

  •  Database
  • ChangeTracker : 동일한 context instance를 통해 가져온 entities의 상태를 track하기 위한 property
  • Model

entity와 properties의 정보에 접근하기 위해서 Model property를 사용할 수 있다. 

    [Table("Orders")]
    public class OrderModel
    {
        [Key]
        public long OrderId { get; set; }

        public DateTime CreationDate { get; set; }

        public decimal PaidAmount { get; set; }

        public DateTime? ShippingDate { get; set; }

        public OrderModelStatus Status { get; set; }

        public ICollection<OrderItemModel> Items { get; set; } = new List<OrderItemModel>();
    }
var orderEntity = _context.Model.FindEntityType(typeof(OrderModel).FullName);

var tableName = orderEntity.GetTableName();
var schemaName = orderEntity.GetSchema();
var key = orderEntity.FindPrimaryKey();
var properties = orderEntity.GetProperties();

Console.WriteLine("tableName:" + tableName);
Console.WriteLine("schemaName:" + schemaName);
Console.WriteLine("key:" + key);
Console.WriteLine("properties:" + string.Join(',', properties.Select(x => x.Name)));
tableName:Orders
schemaName:dbo
key:Key: OrderModel.OrderId PK
properties:OrderId,CreationDate,PaidAmount,ShippingDate,Status

 

728x90
반응형

댓글