媒介
现在 EF Core 的最新版本为 2.0.0-priview1-final
,所以本篇文章主假如针对此版本的一些申明。
注重:假如你要在Visual Studio 中运用 .NET Core 2.0 , 你须要最少 Visual Studio 2017 15.3 预览版本。
相干mysql视频教程引荐:《mysql教程》
装置或升级到 EF Core 2.0
你能够经由过程以下敕令来装置或许升级你现在的 .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
EF Core 2.0 新功用
革新的 LINQ 翻译
防止建立不必要的子查询
一些敕令将切换到客户端举行实行
只要少数要求才会检索表的一切列
有事没有恰当的过滤前提,将单个LINQ 查询转换为 N + 1 查询。
EF.Functions.Like()
在 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()
来在查询中禁用此全局过滤器。
DbContext 连接池
通常在 ASP.NET Core 中运用 EF Core 会涉及到自定义的 DbContext,然后注入到体系容器中,再经由过程 Controller 的组织函数从容器中来猎取该对象实例。这也就意味着在每一个要求中都邑建立一个新的实例。
在EF Core 2.0 中,引入了一种新的注入自定义DbContext的体式格局,它显现的运用了一种实例池的体式格局来注入到容器。
services.AddDbContextPool<BloggingContext>( options => options.UseSqlServer(connectionString));
运用此体式格局的话,当 Controller 要求 DbContext 实例的时刻,将会起首搜检池中是不是有可用的实例,一旦要求处置惩罚完成,附加到改实例上的任何状况都将会重置,然后实例会从新返回到池中。
这个观点有点相似 ADO.NET 中的数据库连接池,它具有节约初始化 DbContext 实例本钱的长处。许多ASP.NET Core 运用程序能够采纳此体式格局来获得机能上的提拔。
手动编译查询
在之前版本的 EF 和 Linq to SQL 中提供有能够手动或许显现的编译查询的API,它许可运用程序缓存已翻译的查询,如许他们就能够只编译一次,而且实行屡次。
虽然 EF Core 能够依据查询表达式自动编译懈弛存查询,然则这类机制能够经由过程绕过哈希盘算或许高速缓存来猎取小幅的查询机能提拔,从而许可运用程序运用已挪用托付链编译经由过程的查询。
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 还将对一些日记纪录以及诊断的基本架构举行一些比较大的调解,以及和 Azure Application Insights 的整合事情。
关于 Lazy Loading (耽误加载)功用的增添,现在还在议论当中,或许会在 EF Core 2.1 中增加此功用。
以上就是EF Core 2.0 新特征的细致内容,更多请关注ki4网别的相干文章!