用户:小朱/沙盒/Entity Framework Core

开发者 | Microsoft |
---|---|
预览版本 | 1.0.0-rc1(2015年11月18日 | )
编程语言 | C# |
类型 | 资料存取 |
许可协议 | Apache License 2.0 |
网站 | 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 作为资料存取的解决方案。
核心功能
[编辑]Entity Framework Core 基本上以 ORM 架构为主,延续 Entity Framework 的作法发展,但 Entity Framework Core 不再支援 Database First 与 Model First 模式,而仅支援 Code First 模式,亦即使用程式码来处理 Model 以及资料库纲要对应的工作。
Entity Framework Core 1.0.0 目前支援下列功能 [1]:
- 资料库塑模 (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 支援下列资料提供者 [2]:
- SQL Server
- SQLite
- In-Memory (记忆体内资料库),可供不需要存取到关联性资料库的测试工作。
- PostgreSQL
- SQL Server Compact
- IBM 资料库伺服器
开发方式
[编辑]依照使用的应用程式类型不同会有些许差异,但基本上会是这样的模式 [3]:
- 在 project.json 中加入对 EntityFrameworkCore 的参考。
- 在 project.json 的 commands 区段中加入 "ef": "EntityFrameworkCore.Commands" 的设定。
- 以程式码宣告应用程式内使用的 Models。
- 以程式码继承 DbContext 类别,覆写 OnConfiguring() 设定要使用的资料提供者,并覆写 OnModelCreating() 设定 Model 与资料库的对应。
- 使用 EF 的 CLI 介面建立或更新资料库。
- 在程式内使用 DbContext 的继承类别来存取资料库。
下列程式为 project.json 的例子:
{
"dependencies": {
"EntityFramework.Sqlite": "7.0.0-rc1-final",
"EntityFramework.Commands": "7.0.0-rc1-final",
"Microsoft.Extensions.PlatformAbstractions": "1.0.0-rc1-final"
},
"commands": {
"run": "ConsoleApp",
"ef": "EntityFramework.Commands"
},
"frameworks": {
"dnxcore50": {
"dependencies": {
"System.Console": "4.0.0-beta-*"
}
}
}
}
下列程式码为 DbContext 覆写的例子:
public class BloggingContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
var path = PlatformServices.Default.Application.ApplicationBasePath;
optionsBuilder.UseSqlite("Filename=" + Path.Combine(path, "blog.db"));
}
}
下列程式码为呼叫 DbContext 继承类别存取资料库的例子:
using System;
namespace ConsoleApp
{
public class Program
{
public static void Main()
{
using (var db = new BloggingContext())
{
db.Blogs.Add(new Blog { Url = "http://blogs.msdn.com/adonet" });
var count = db.SaveChanges();
Console.WriteLine("{0} records saved to database", count);
Console.WriteLine();
Console.WriteLine("All blogs in database:");
foreach (var blog in db.Blogs)
{
Console.WriteLine(" - {0}", blog.Url);
}
}
}
}
}
ASP.NET Core 应用程式的组态会是放在 Startup.cs 内的 ConfigureServices(),这和其他类别应用有些许不同,在 MVC 6 的 Controller 内采用相依注入的方式传入 DbContext 类别,因此大多不需要自行建立其物件实体。
参考
[编辑]