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 인터페이스는 여기에 있습니다.
상태 변경 이벤트
새 Tracked
및 StateChanged
이벤트를 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을 사용하는 것이 좋습니다.
팁
새로운 기능에서 예기치 않은 비호환성 또는 문제가 발견되거나 피드백이 있는 경우 문제 추적기
.NET