這篇文章主要介紹了EF Core 2.0新特性是什么,具有一定借鑒價(jià)值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。
成都創(chuàng)新互聯(lián)公司專注于海湖新網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供海湖新營銷型網(wǎng)站建設(shè),海湖新網(wǎng)站制作、海湖新網(wǎng)頁設(shè)計(jì)、海湖新網(wǎng)站官網(wǎng)定制、微信平臺小程序開發(fā)服務(wù),打造海湖新網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供海湖新網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
目前 EF Core 的最新版本為 2.0.0-priview1-final
,所以本篇文章主要是針對此版本的一些說明。
注意:如果你要在Visual Studio 中使用 .NET Core 2.0 , 你需要至少 Visual Studio 2017 15.3 預(yù)覽版本。
你可以通過以下命令來安裝或者升級你目前的 .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 文件// 或者通過以下命令 PM> update-package Microsoft.EntityFrameworkCore.Tools -Pre -Version 2.0.0-preview1-final
避免創(chuàng)建不必要的子查詢
一些命令將切換到客戶端進(jìn)行執(zhí)行
只有少數(shù)請求才會檢索表的所有列
有事沒有適當(dāng)?shù)倪^濾條件,將單個(gè)LINQ 查詢轉(zhuǎn)換為 N + 1 查詢。
在 EF Core 2.0 中添加了 EF.Functions 屬性,EF Core Provider 可以使用它們來自定義一些映射到數(shù)據(jù)庫函數(shù)后者運(yùn)算符的方法,以便于在 LINQ 查詢中調(diào)用它們。如:
var aCustomers = from c in context.Customers where EF.Functions.Like(c.Name, "a%"); select c;
分離實(shí)體和表什么意思呢?在以前,一個(gè)數(shù)據(jù)庫表會映射到 EF 中的一個(gè)實(shí)體對象,也就是表和實(shí)體是一一對應(yīng)的關(guān)系。那么在 2.0 版本中,允許映射一些關(guān)聯(lián)的實(shí)體到一個(gè)表中,并且EF會維護(hù)這些實(shí)例或者引用關(guān)系。
modelBuilder.Entity() .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; } }
在生成數(shù)據(jù)庫表的時(shí)候,Customer
和 Address
將生成為一個(gè)表。
注意:priview1 中此功能暫不完整。
新版本引入了一個(gè)叫做“垂直過濾”的一個(gè)功能,這是一個(gè)比較常見的需求。
在我們定義EF Core上下文模型的時(shí)候,可以在模型創(chuàng)建的時(shí)候附加一些過濾條件,比如在查詢的時(shí)候總是過濾掉一些“邏輯刪除”的數(shù)據(jù)。
public class BloggingContext : DbContext { public DbSetBlogs { get; set; } public DbSet Posts { get; set; } public int TenantId {get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity () .HasQueryFilter(p => !p.IsDeleted && p.TenantId == this.TenantId ); } }
當(dāng)通過直接查詢或者導(dǎo)航屬性(Include()
)查詢類型數(shù)據(jù)時(shí),將會自動應(yīng)用此過濾條件。當(dāng)然你可以使用 IgnoreQueryFilters()
來在查詢中禁用此全局過濾器。
通常在 ASP.NET Core 中使用 EF Core 會涉及到自定義的 DbContext,然后注入到系統(tǒng)容器中,再通過 Controller 的構(gòu)造函數(shù)從容器中來獲取該對象實(shí)例。這也就意味著在每個(gè)請求中都會創(chuàng)建一個(gè)新的實(shí)例。
在EF Core 2.0 中,引入了一種新的注入自定義DbContext的方式,它顯示的使用了一種實(shí)例池的方式來注入到容器。
services.AddDbContextPool( options => options.UseSqlServer(connectionString));
使用此方式的話,當(dāng) Controller 請求 DbContext 實(shí)例的時(shí)候,將會首先檢查池中是否有可用的實(shí)例,一旦請求處理完成,附加到改實(shí)例上的任何狀態(tài)都將會重置,然后實(shí)例會重新返回到池中。
這個(gè)概念有點(diǎn)類似 ADO.NET 中的數(shù)據(jù)庫連接池,它具有節(jié)省初始化 DbContext 實(shí)例成本的優(yōu)點(diǎn)。很多ASP.NET Core 應(yīng)用程序可以采用此方式來獲得性能上的提升。
在以前版本的 EF 和 Linq to SQL 中提供有可以手動或者顯示的編譯查詢的API,它允許應(yīng)用程序緩存已經(jīng)翻譯的查詢,這樣他們就可以只編譯一次,并且執(zhí)行多次。
雖然 EF Core 可以根據(jù)查詢表達(dá)式自動編譯和緩存查詢,但是這種機(jī)制可以通過繞過哈希計(jì)算或者高速緩存來獲取小幅的查詢性能提升,從而允許應(yīng)用程序使用已經(jīng)調(diào)用委托鏈編譯通過的查詢。
private static Func_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 還將對一些日志記錄以及診斷的基礎(chǔ)架構(gòu)進(jìn)行一些比較大的調(diào)整,以及和 Azure Application Insights 的整合工作。
對于 Lazy Loading (延遲加載)功能的增加,目前還在討論當(dāng)中,也許會在 EF Core 2.1 中添加此功能。
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享EF Core 2.0新特性是什么內(nèi)容對大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,遇到問題就找創(chuàng)新互聯(lián),詳細(xì)的解決方法等著你來學(xué)習(xí)!