EF Core의 최신 버전은 현재 2.0.0-priview1-final
이므로 이 문서에서는 주로 이 버전에 대한 몇 가지 지침을 다루고 있습니다. 2.0.0-priview1-final
,所以本篇文章主要是针对此版本的一些说明。
注意:如果你要在Visual Studio 中使用 .NET Core 2.0 , 你需要至少 Visual Studio 2017 15.3 预览版本。
相关mysql视频教程推荐:《mysql教程》
你可以通过以下命令来安装或者升级你目前的 .NET Core 版本。
// 安装 PM> install-package Microsoft.EntityFrameworkCore.SqlServer -Pre -Version 2.0.0-preview1-final // 升级 PM> update-package Microsoft.EntityFrameworkCore.SqlServer -Pre -Version 2.0.0-preview1-final
工具包
// 直接修改 CSPROJ 文件 <ItemGroup> <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0-preview1-final" /> </ItemGroup> // 或者通过以下命令 PM> update-package Microsoft.EntityFrameworkCore.Tools -Pre -Version 2.0.0-preview1-final
避免创建不必要的子查询
一些命令将切换到客户端进行执行
只有少数请求才会检索表的所有列
有事没有适当的过滤条件,将单个LINQ 查询转换为 N + 1 查询。
在 EF Core 2.0 中添加了 EF.Functions 属性,EF Core Provider 可以使用它们来自定义一些映射到数据库函数后者运算符的方法,以便于在 LINQ 查询中调用它们。如:
var aCustomers = from c in context.Customers where EF.Functions.Like(c.Name, "a%"); select c;
分离实体和表什么意思呢?在以前,一个数据库表会映射到 EF 中的一个实体对象,也就是表和实体是一一对应的关系。那么在 2.0 版本中,允许映射一些关联的实体到一个表中,并且EF会维护这些实例或者引用关系。
modelBuilder.Entity<Customer>() .OwnsOne(c => c.WorkAddress);public class Customer { public int CustomerId { get; set; } public Address WorkAddress { get; set; } }public class Address { public string Line { get; set; } public string PostalOrZipCode { get; set; } public string StateOrProvince { get; set; } public string CityOrTown { get; internal set; } }
在生成数据库表的时候,Customer
和 Address
将生成为一个表。
注意:priview1 中此功能暂不完整。
新版本引入了一个叫做“垂直过滤”的一个功能,这是一个比较常见的需求。
在我们定义EF Core上下文模型的时候,可以在模型创建的时候附加一些过滤条件,比如在查询的时候总是过滤掉一些“逻辑删除”的数据。
public class BloggingContext : DbContext { public DbSet<Blog> Blogs { get; set; } public DbSet<Post> Posts { get; set; } public int TenantId {get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Post>() .HasQueryFilter(p => !p.IsDeleted && p.TenantId == this.TenantId ); } }
当通过直接查询或者导航属性(Include()
)查询类型数据时,将会自动应用此过滤条件。当然你可以使用 IgnoreQueryFilters()
설치 또는 EF Core 2.0으로 업그레이드
다음 명령을 통해 현재 .NET Core 버전을 설치하거나 업그레이드할 수 있습니다.
services.AddDbContextPool<BloggingContext>( options => options.UseSqlServer(connectionString));
Toolkit
private static Func<CustomerContext, int, Customer> _customerById = EF.CompileQuery((CustomerContext db, int id) => db.Customers .Include(c => c.Address) .Single(c => c.Id == id)); ...using (var db = new CustomerContext()) { var customer = _customerById(db, 147); }
EF Core 2.0의 새로운 기능
불필요한 하위 쿼리 생성 방지
일부 명령은 실행을 위해 클라이언트로 전환
때때로 적절한 필터링 조건 없이 단일 LINQ 쿼리가 실행되는 경우가 있습니다. N으로 변환 +1 쿼리.
EF.Functions.Like()
EF Core 2.0에 EF.Functions 속성을 추가하면 EF Core Provider는 이를 사용하여 데이터베이스 함수 및 후자 연산자에 매핑되는 일부 메서드를 사용자 지정할 수 있습니다. LINQ 쿼리에서 호출할 수 있습니다. 예:
rrreee
엔터티와 테이블을 분리한다는 것은 무엇을 의미하나요? 과거에는 데이터베이스 테이블이 EF의 엔터티 개체에 매핑되었습니다. 즉, 테이블과 엔터티 간에 일대일 대응이 있었습니다. 그런 다음 버전 2.0에서는 일부 관련 엔터티를 테이블에 매핑할 수 있으며 EF는 이러한 인스턴스 또는 참조 관계를 유지 관리합니다.
데이터베이스 테이블 생성 시 고객
과 주소
가 하나의 테이블로 생성됩니다.
Include()
)을 통해 유형 데이터를 쿼리할 때 자동으로 적용됩니다. 물론 IgnoreQueryFilters()
를 사용하여 쿼리에서 이 전역 필터를 비활성화할 수 있습니다. 🎜🎜DbContext 연결 풀🎜🎜일반적으로 ASP.NET Core에서 EF Core를 사용하려면 DbContext를 사용자 지정해야 하며, 이는 시스템 컨테이너에 삽입된 다음 컨트롤러 생성자를 통해 컨테이너에서 개체 인스턴스를 가져옵니다. 즉, 🎜모든 요청🎜에 대해 새 인스턴스가 생성됩니다. 🎜🎜EF Core 2.0에는 인스턴스 풀을 명시적으로 사용하여 컨테이너에 삽입하는 사용자 지정 DbContext를 삽입하는 새로운 방법이 도입되었습니다. 🎜rrreee🎜이 방법을 사용하면 컨트롤러가 DbContext 인스턴스를 요청할 때 먼저 풀에 사용 가능한 인스턴스가 있는지 확인합니다. 요청이 처리되면 인스턴스에 연결된 모든 상태가 재설정되고 인스턴스가 재설정됩니다. 수영장으로 돌아갑니다. 🎜🎜이 개념은 DbContext 인스턴스 초기화 비용을 절약할 수 있다는 장점이 있는 ADO.NET의 데이터베이스 연결 풀과 다소 유사합니다. 많은 ASP.NET Core 애플리케이션은 이 접근 방식을 사용하여 성능을 향상시킬 수 있습니다. 🎜🎜수동으로 컴파일된 쿼리🎜🎜이전 버전의 EF 및 Linq to SQL에는 쿼리를 수동으로 또는 명시적으로 컴파일하는 API가 있었습니다. 이를 통해 애플리케이션은 변환된 쿼리를 캐시하여 한 번만 컴파일하고 여러 번 실행할 수 있었습니다. -비율. 🎜🎜EF Core는 쿼리 식을 기반으로 쿼리를 자동으로 컴파일하고 캐시할 수 있지만 이 메커니즘은 해시 계산 또는 캐싱을 우회하여 쿼리 성능을 약간 향상시킬 수 있으므로 애플리케이션이 쿼리 호출을 통해 컴파일된 대리자 체인을 사용할 수 있습니다. 🎜rrreee🎜Others🎜🎜EF Core 2.0에서는 일부 로깅 및 진단 인프라를 크게 조정하고 Azure Application Insights와 통합할 예정입니다. 🎜🎜지연 로딩 추가는 아직 논의 중이며 이 기능은 EF Core 2.1에 추가될 수 있습니다. 🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜 🎜위 내용은 EF Core 2.0의 새로운 기능의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!