用户:小朱/沙盒/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 类别,因此大多不需要自行创建其对象实体。
参考
[编辑]