Entity Framework Core
原作者 | Microsoft |
---|---|
開發者 | .NET Foundation and the open source community |
目前版本 |
|
原始碼媒體櫃 | |
程式語言 | C# |
類型 | 開放原始碼、資料存取 |
許可協定 | MIT license |
網站 | GitHub、檔案庫 |
Entity Framework Core 是微軟新一代的物件關聯對應 (ORM) 框架,以 .NET Core 實作,不過它是歸屬於 ASP.NET Core 專案的一部份,在 ASP.NET Core 開始開發時就被列入標準功能,與現行的 Entity Framework 一樣,是微軟官方建議使用的資料存取功能,但 .NET Core 成功移植 ADO.NET 基礎類別庫 System.Data 之後,開發人員仍能使用 ADO.NET 作為資料存取的解決方案。
歷史
[編輯]2014年5月19日,微軟決定為了讓其.NET能跨平台,下一版Entity Framework將完全重寫。[2]2016年6月27日,發佈了Entity Framework Core 1.0, 伴隨着ASP.NET Core 1.0 和 .NET Core 1.0.[3]本來其命名為Entity Framework 7,但為了突出其是完全重寫而不是替換EF6所以重新命名。[4]
Entity Framework Core 所有版本是完全獨立的程式碼媒體櫃,作為NuGet包提供。
Entity Framework Core 1.0使用Apache License v2 在GitHub (頁面存檔備份,存於互聯網檔案館)開源。可執行於Windows, Linux和OSX。[2]
2017年8月14日隨Visual Studio 2017 15.3 和 ASP.NET Core 2.0 發佈Entity Framework Core 2.0[5]。
2019年9月23日隨Visual Studio 2019 16.3 和 ASP.NET Core 3.0發佈Entity Framework Core 3.0[6]。
2019年12月3日發佈了Entity Framework Core 3.1 (EF Core 3.1)並作為長期支援版本至少支援到2022年12月3日。[7][8]
2021年1月12日發佈了Entity Framework Core 5.0.2 (EF Core 5)[7][8]。
2021年11月10日發佈了Entity Framework Core 6.0 (EF Core 6)[9][10]。
核心功能
[編輯]Entity Framework Core 基本上以 ORM 架構為主,延續 Entity Framework 的作法發展,但 Entity Framework Core 不再支援 Database First 與 Model First 模式,而僅支援 Code First 模式,亦即使用程式碼來處理 Model 以及資料庫綱要對應的工作。
Entity Framework Core 1.0.0 目前支援下列功能 [11]:
- 資料庫塑模 (Modeling):使用 POCO 方式建立 Model 與其關聯性、影子狀態 (Shadow State) 屬性維護、唯一性限制與索引、內建轉換、模型驗證、鍵值自動產生與關聯-表格對應等。
- 變更追蹤 (Change Tracking):快照式變更追蹤、存取已追蹤的狀態與附加已解除附加的資料項目或物件結構 (graph)。
- 儲存功能 (Save Changes):基本資料儲存功能、樂觀式鎖定、非同步變更儲存、交易能力與批次處理。
- 查詢 (Query):基本 LINQ 的支援、混合式主從架構評估、關閉追蹤功能、早期載入、非同步查詢、基本 BCL 函數的轉換與 SQL 指令的執行。
- 資料庫綱要管理 (Database Schema Management):資料庫建立與刪除的 API 支援、資料庫錯誤頁面 (由 ASP.NET Core 提供) 與關聯性資料庫移轉等。
目前正在實作中的有:
- 資料庫塑模 (Modeling):資料標記 (Entity Framework 時代的 Data Annotations) 與 TPH 繼承模式。
- 分工的質素 (Cross-cutting quality):檔案、Intellisense 檔案與 API 檢閱。
- 效能 (Performance):額外的效能覆蓋與效能增進。
- 查詢 (Query):對關聯屬性的查詢轉換。
- 資料庫的反向工程 (類似於 EF 的 Database First)。
- 穩定化對 Mac 與 Linux 的功能。
- 新的資料提供者。
在 1.0.0 內計劃的功能有:
- 設計時期脈絡 (context) 的發現與載入。
- 部署能力。
- 串聯式刪除。
- 記錄功能。
資料提供者
[編輯]Entity Framework Core 支援下列資料提供者 [12][13][14]:
- SQL Server
- SQLite
- In-Memory (記憶體內資料庫),可供不需要存取到關聯性資料庫的測試工作。
- PostgreSQL
- SQL Server Compact
- IBM 資料庫伺服器
- MySQL
開發方式
[編輯]Entity Framework Core 的開發方式與原有 Entity Framework 不同的是,Entity Framework Core 不再支援以 UI 為主的資料庫組態 (這是為了要適應 Linux 與 Mac 的開發環境),且不論是何種模式 (Database First / Code First),都是以程式碼為主的環境對應,不再有 EDMX (Entity Framework Metadata) 存在,為達成這個目標,Entity Framework 提供了 Scaffold-Database 指令 (於 Package Management Console 中執行),允許開發人員由資料庫來產生 Model 的程式碼。
Scaffold-DbContext "'Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;''" Microsoft.EntityFrameworkCore.SqlServer
原本 Entity Framework 現有的資料模型同步指令 Add-Migration 與 Update-Database 在 Entity Framework Core 仍然支援,包含前述的 Scaffold-Database 指令,都被包裝在 Microsoft.EntityFrameworkCore.Tools 套件內,可以由 Package Management Console 中執行 Install-Package 安裝它,或是直接編輯 project.json 將它加入相依套件,然後再於 project.json 中加入工具的相關設置:
"tools": {
"Microsoft.EntityFrameworkCore.Tools": {
"version": "1.0.0-preview1-final",
"imports": [
"portable-net45+win8+dnxcore50",
"portable-net45+win8"
]
}
若是使用 Scaffold-Database 指令探測資料庫時,除了 Model 會自動產生外,也會一併產生 DbContext 類別的衍生程式,作為連結資料庫的入口,若是由新資料庫,或是未使用 Scaffold-Database 指令的話,就要自行撰寫這個類別。
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata;
namespace EFGetStarted.AspNetCore.ExistingDb.Models
{
public partial class BloggingContext : DbContext
{
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>(entity =>
{
entity.Property(e => e.Url).IsRequired();
});
modelBuilder.Entity<Post>(entity =>
{
entity.HasOne(d => d.Blog)
.WithMany(p => p.Post)
.HasForeignKey(d => d.BlogId);
});
}
public virtual DbSet<Blog> Blog { get; set; }
public virtual DbSet<Post> Post { get; set; }
}
}
就可以使用 DbContext 來操作資料庫了,之後的部份就和 Entity Framework 差異不大。 若是 ASP.NET Core,則需再到 ASP.NET Core 的起始類別 (例如 Startup.cs),將 Entity Framework Core 的 DbContext 加到 Dependency Injection 裏面。
public void ConfigureServices(IServiceCollection services)
{
var connection = @"Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;";
services.AddDbContext<BloggingContext>(options => options.UseSqlServer(connection));
// ...
}
之後就可以由 Controller 取得這個 DbContext 進行資料存取的動作了,例如:
using EFGetStarted.AspNetCore.ExistingDb.Models;
using Microsoft.AspNetCore.Mvc;
using System.Linq;
namespace EFGetStarted.AspNetCore.ExistingDb.Controllers
{
public class BlogsController : Controller
{
private BloggingContext _context;
public BlogsController(BloggingContext context)
{
_context = context;
}
public IActionResult Index()
{
return View(_context.Blog.ToList());
}
public IActionResult Create()
{
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Create(Blog blog)
{
if (ModelState.IsValid)
{
_context.Blog.Add(blog);
_context.SaveChanges();
return RedirectToAction("Index");
}
return View(blog);
}
}
}
參考
[編輯]- ^ Release 8.0.10. 2024年10月8日 [2024年10月21日].
- ^ 2.0 2.1 EF7 - New Platforms, New Data Stores. May 19, 2014. (原始內容存檔於2015-09-29).
- ^ Entity Framework Core 1.0.0 Available. 27 June 2016 [2022-06-18]. (原始內容存檔於2019-01-12).
- ^ Hanselman, Scott. ASP.NET 5 is dead - Introducing ASP.NET Core 1.0 and .NET Core 1.0 - Scott Hanselman. www.hanselman.com. [2016-07-11]. (原始內容存檔於2016-01-20).
- ^ Announcing .NET Core 2.0. .NET Blog. 14 August 2017 [2022-06-18]. (原始內容存檔於2018-01-21).
- ^ Announcing .NET Core 3.0. .NET Blog. 23 September 2019 [2022-06-18]. (原始內容存檔於2020-06-01).
- ^ 7.0 7.1 EF Core releases and planning. [2022-06-18]. (原始內容存檔於2022-07-24).
- ^ 8.0 8.1 Microsoft.EntityFrameworkCore 5.0.11. [2022-06-18]. (原始內容存檔於2022-06-26).
- ^ EF Core releases and planning. [2022-06-18]. (原始內容存檔於2022-07-06).
- ^ Microsoft.EntityFrameworkCore 6.0. [2022-06-18]. (原始內容存檔於2022-06-26).
- ^ Roadmap. [2016-03-13]. (原始內容存檔於2015-09-12).
- ^ Database Providers. [2016-03-13]. (原始內容存檔於2016-03-13).
- ^ ajcvickers. 比较 EF6 和 EF Core. docs.microsoft.com. [2022-08-27]. (原始內容存檔於2022-08-27) (中文(中國大陸)).
- ^ ajcvickers. 数据库提供程序 - EF Core. docs.microsoft.com. [2022-08-27]. (原始內容存檔於2022-08-27) (中文(中國大陸)).