首頁  >  文章  >  後端開發  >  EF Core 2.0 新特性

EF Core 2.0 新特性

大家讲道理
大家讲道理原創
2017-05-31 14:39:042119瀏覽




#前言

目前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; }
}

在產生資料庫表格的時候,

CustomerAddress 將會產生為一個表格。

注意: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 新特性的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn