User:小朱/沙盒/Entity Framework Core

Entity Framework Core
開發者Microsoft
预览版本1.0.0-rc1(2015年11月18日 (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]

  1. SQL Server
  2. SQLite
  3. In-Memory (記憶體內資料庫),可供不需要存取到關聯性資料庫的測試工作。
  4. PostgreSQL
  5. SQL Server Compact
  6. IBM 資料庫伺服器

開發方式

依照使用的應用程式類型不同會有些許差異,但基本上會是這樣的模式 [3]

  1. 在 project.json 中加入對 EntityFrameworkCore 的參考。
  2. 在 project.json 的 commands 區段中加入 "ef": "EntityFrameworkCore.Commands" 的設定。
  3. 以程式碼宣告應用程式內使用的 Models。
  4. 以程式碼繼承 DbContext 類別,覆寫 OnConfiguring() 設定要使用的資料提供者,並覆寫 OnModelCreating() 設定 Model 與資料庫的對應。
  5. 使用 EF 的 CLI 介面建立或更新資料庫。
  6. 在程式內使用 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 類別,因此大多不需要自行建立其物件實體。

參考