Entity Framework Core
Entity Framework Core 是微软新一代的对象关系对应 (ORM) 框架,以 .NET Core 实现,不过它是归属于 ASP.NET Core 项目的一部分,在 ASP.NET Core 开始开发时就被列入标准功能,与现行的 Entity Framework 一样,是微软官方建议使用的资料访问功能,但 .NET Core 成功移植 ADO.NET 基类库 System.Data 之后,开发人员仍能使用 ADO.NET 作为资料访问的解决方案。
原作者 | Microsoft |
---|---|
开发者 | .NET Foundation and the open source community |
当前版本 |
|
源代码库 | |
编程语言 | C# |
类型 | 开放源代码、资料访问 |
许可协议 | MIT license |
网站 | GitHub、文件库 |
历史
编辑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]
核心功能
编辑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) (中文(中国大陆)).