| 原作者 | 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]:
目前正在實作中的有:
在 1.0.0 內計畫的功能有:
Entity Framework Core 支援下列資料提供者[12][13][14]:
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 指令的話,就要自行撰寫這個類別。
usingMicrosoft.EntityFrameworkCore;usingMicrosoft.EntityFrameworkCore.Metadata;namespaceEFGetStarted.AspNetCore.ExistingDb.Models{publicpartialclassBloggingContext:DbContext{protectedoverridevoidOnConfiguring(DbContextOptionsBuilderoptionsBuilder){}protectedoverridevoidOnModelCreating(ModelBuildermodelBuilder){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);});}publicvirtualDbSet<Blog>Blog{get;set;}publicvirtualDbSet<Post>Post{get;set;}}}
就可以使用 DbContext 來操作資料庫了,之後的部份就和 Entity Framework 差異不大。若是 ASP.NET Core,則需再到 ASP.NET Core 的起始類別 (例如 Startup.cs),將 Entity Framework Core 的 DbContext 加到 Dependency Injection 裡面。
publicvoidConfigureServices(IServiceCollectionservices){varconnection=@"Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;";services.AddDbContext<BloggingContext>(options=>options.UseSqlServer(connection));// ...}
之後就可以由 Controller 取得這個 DbContext 進行資料存取的動作了,例如:
usingEFGetStarted.AspNetCore.ExistingDb.Models;usingMicrosoft.AspNetCore.Mvc;usingSystem.Linq;namespaceEFGetStarted.AspNetCore.ExistingDb.Controllers{publicclassBlogsController:Controller{privateBloggingContext_context;publicBlogsController(BloggingContextcontext){_context=context;}publicIActionResultIndex(){returnView(_context.Blog.ToList());}publicIActionResultCreate(){returnView();}[HttpPost][ValidateAntiForgeryToken]publicIActionResultCreate(Blogblog){if(ModelState.IsValid){_context.Blog.Add(blog);_context.SaveChanges();returnRedirectToAction("Index");}returnView(blog);}}}