User:小朱/沙盒/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 類別,因此大多不需要自行建立其物件實體。
參考
[编辑]