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) (中文(中国大陆)).