다음을 통해 공유


EF Core 2.1의 새로운 기능

EF Core 2.1에는 수많은 버그 수정 및 작은 기능 및 성능 향상 외에도 몇 가지 강력한 새로운 기능이 포함되어 있습니다.

지연 로드 (Lazy Loading)

이제 EF Core에는 요청 시 탐색 속성을 로드할 수 있는 엔터티 클래스를 작성하는 모든 사용자가 필요한 구성 요소를 포함합니다. 또한 이러한 구성 요소를 활용하여 최소 수정된 엔터티 클래스(예: 가상 탐색 속성이 있는 클래스)를 기반으로 지연 로드 프록시 클래스를 생성하는 새 패키지인 Microsoft.EntityFrameworkCore.Proxies도 만들었습니다.

이 주제에 대한 자세한 내용은 섹션에서 지연 로드을 참조하세요.

엔터티 생성자의 매개 변수

지연 로드를 위한 필수 구성 요소 중 하나로, 생성자에서 매개변수를 사용하는 엔터티를 만들 수 있도록 했습니다. 매개 변수를 사용하여 속성 값, 래지 로딩 대리자 및 서비스를 삽입할 수 있습니다.

이 항목에 대한 자세한 내용은 매개 변수가인 엔터티 생성자의 섹션을 참조하세요.

값 변환

지금까지 EF Core는 기본 데이터베이스 공급자가 기본적으로 지원하는 형식의 속성만 매핑할 수 있었습니다. 값은 변환 없이 열과 속성 간에 앞뒤로 복사되었습니다. EF Core 2.1부터 값 변환을 적용하여 열에서 가져온 값을 속성에 적용하기 전에 변환할 수 있으며 그 반대의 경우도 마찬가지입니다. 필요에 따라 규칙에 따라 적용할 수 있는 많은 변환과 열과 속성 간에 사용자 지정 변환을 등록할 수 있는 명시적 구성 API가 있습니다. 이 기능의 애플리케이션 중 일부는 다음과 같습니다.

  • 열거형을 문자열로 저장
  • SQL Server를 사용하여 부호 없는 정수 매핑
  • 속성 값의 자동 암호화 및 암호 해독

값 변환에 대한 더 많은 정보를 위해 섹션의을 읽어보세요.

LINQ 'GroupBy' 번역

버전 2.1 이전에는 EF Core에서 GroupBy LINQ 연산자가 항상 메모리에서 평가됩니다. 이제 대부분의 경우 SQL GROUP BY 절로 변환할 수 있습니다.

이 예제에서는 다양한 집계 함수를 계산하는 데 사용되는 GroupBy가 있는 쿼리를 보여 줍니다.

var query = context.Orders
    .GroupBy(o => new { o.CustomerId, o.EmployeeId })
    .Select(g => new
        {
          g.Key.CustomerId,
          g.Key.EmployeeId,
          Sum = g.Sum(o => o.Amount),
          Min = g.Min(o => o.Amount),
          Max = g.Max(o => o.Amount),
          Avg = g.Average(o => o.Amount)
        });

해당하는 SQL 번역은 다음과 같습니다.

SELECT [o].[CustomerId], [o].[EmployeeId],
    SUM([o].[Amount]), MIN([o].[Amount]), MAX([o].[Amount]), AVG([o].[Amount])
FROM [Orders] AS [o]
GROUP BY [o].[CustomerId], [o].[EmployeeId];

데이터 시딩

새 릴리스를 사용하면 데이터베이스를 채울 초기 데이터를 제공할 수 있습니다. EF6과 달리, 시드 데이터는 모델 구성의 일부로 엔티티 유형에 연결됩니다. 그런 다음 EF Core 마이그레이션은 데이터베이스를 새 버전의 모델로 업그레이드할 때 적용해야 하는 삽입, 업데이트 또는 삭제 작업을 자동으로 계산할 수 있습니다.

예를 들어 이것을 사용하여 OnModelCreating에 있는 Post의 시드 데이터를 구성할 수 있습니다.

modelBuilder.Entity<Post>().HasData(new Post{ Id = 1, Text = "Hello World!" });

더 많은 정보를 얻으려면 데이터 시드에 대한 섹션과을 참조하세요.

쿼리 형식

이제 EF Core 모델에 쿼리 형식이 포함될 수 있습니다. 엔터티 형식과 달리 쿼리 형식에는 키가 정의되어 있지 않으며 삽입, 삭제 또는 업데이트할 수 없지만(즉, 읽기 전용임) 쿼리에서 직접 반환할 수 있습니다. 쿼리 형식에 대한 사용 시나리오 중 일부는 다음과 같습니다.

  • 기본 키가 없는 보기로의 매핑
  • 기본 키 없이 테이블에 매핑
  • 모델에 정의된 쿼리에 매핑
  • FromSql() 쿼리의 반환 형식으로 사용

이 항목에 대한 자세한 내용은 쿼리 유형 섹션을 참조하세요.

파생 형식 포함

이제 Include 메서드에 대한 식을 작성할 때 파생 형식에만 정의된 탐색 속성을 지정할 수 있습니다. 강력한 형식의 Include버전의 경우 명시적 캐스트 또는 as 연산자 사용을 지원합니다. 또한 이제 문자열 버전의 Include에서 파생 형식에 정의된 탐색 속성의 이름을 참조하는 것도 지원합니다.

var option1 = context.People.Include(p => ((Student)p).School);
var option2 = context.People.Include(p => (p as Student).School);
var option3 = context.People.Include("School");

이 주제에 대한 자세한 내용을 알아보려면 파생 형식이 포함된 Include의 섹션 및을 참조하세요.

System.Transactions 지원

TransactionScope와 같은 System.Transactions 기능을 사용할 수 있는 기능이 추가되었습니다. 이를 지원하는 데이터베이스 공급자를 사용하는 경우 .NET Framework와 .NET Core 모두에서 작동합니다.

이 항목에 대한 자세한 내용은 System.Transactions 섹션을 참조하세요.

초기 마이그레이션에서 더 나은 열 순서 지정

고객 피드백에 따라 클래스에서 속성이 선언된 순서와 동일한 순서로 테이블에 대한 열을 생성하도록 마이그레이션을 업데이트했습니다. EF Core는 초기 테이블을 만든 후 새 멤버가 추가될 때 순서를 변경할 수 없습니다.

상호 관련된 하위 쿼리 최적화

쿼리 변환이 개선되어, 프로젝션에서 탐색 속성을 사용할 때 루트 쿼리의 데이터를 상호상관된 하위 쿼리의 데이터와 조인하는 일반적인 상황에서 "N + 1" SQL 쿼리의 실행을 방지할 수 있게 되었습니다. 최적화하려면 하위 쿼리의 결과를 버퍼링해야 하며, 새 동작을 옵트인하도록 쿼리를 수정해야 합니다.

예를 들어, 다음 쿼리는 일반적으로 고객에 대한 하나의 쿼리로 변환되고, N개의 별도 쿼리(여기서 "N"은 반환된 고객 수)는 주문에 대한 쿼리로 변환됩니다.

var query = context.Customers.Select(
    c => c.Orders.Where(o => o.Amount  > 100).Select(o => o.Amount));

올바른 위치에 ToListAsync() 포함하면 버퍼링이 Orders에 적합함을 나타내며 이는 최적화를 가능하게 합니다.

var query = context.Customers.Select(
    c => c.Orders.Where(o => o.Amount  > 100).Select(o => o.Amount).ToList());

이 쿼리는 두 개의 SQL 쿼리로만 변환됩니다. 하나는 고객용 쿼리이고 다른 하나는 주문용 쿼리입니다.

[Owned] 특성

이제 단순히 로 형식에 주석을 추가하고 소유자 엔터티가 모델에 추가되도록 하면 소유 엔터티 형식을 구성할 수 있습니다.

[Owned]
public class StreetAddress
{
    public string Street { get; set; }
    public string City { get; set; }
}

public class Order
{
    public int Id { get; set; }
    public StreetAddress ShippingAddress { get; set; }
}

.NET Core SDK에 포함된 명령줄 도구 dotnet-ef

dotnet-ef 명령은 이제 .NET Core SDK의 일부이므로 프로젝트에서 DotNetCliToolReference를 사용하여 마이그레이션을 사용하거나 기존 데이터베이스에서 DbContext를 스캐폴드할 필요가 없습니다.

여러 버전의 .NET Core SDK 및 EF Core에 명령줄 도구를 사용하도록 설정하는 방법에 대한 자세한 내용은 도구 설치 섹션을 참조하세요.

Microsoft.EntityFrameworkCore.Abstractions 패키지

새 패키지에는 EF Core에 대한 종속성을 전체적으로 사용하지 않고 프로젝트에서 EF Core 기능을 밝히는 데 사용할 수 있는 특성과 인터페이스가 포함되어 있습니다. 예를 들어 [Owned] 특성 및 ILazyLoader 인터페이스는 여기에 있습니다.

상태 변경 이벤트

TrackedStateChanged 이벤트를 ChangeTracker에서 사용하여 DbContext에 들어오거나 상태를 변경하는 엔터티에 반응하는 논리를 작성할 수 있습니다.

원시 SQL 매개 변수 분석기

새 코드 분석기는 FromSql 또는 ExecuteSqlCommand같은 원시 SQL API의 잠재적으로 안전하지 않은 사용을 감지하는 EF Core에 포함되어 있습니다. 예를 들어 다음 쿼리의 경우 minAge 매개 변수화되지 않으므로 경고가 표시됩니다.

var sql = $"SELECT * FROM People WHERE Age > {minAge}";
var query = context.People.FromSql(sql);

데이터베이스 공급자 호환성

EF Core 2.1에서 작동하도록 업데이트되었거나 적어도 테스트된 공급자와 함께 EF Core 2.1을 사용하는 것이 좋습니다.

새로운 기능에서 예기치 않은 비호환성 또는 문제가 발견되거나 피드백이 있는 경우 문제 추적기사용하여 보고하세요.