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

Entity Framework Core
开发者Microsoft
编程语言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 类别,因此大多不需要自行建立其物件实体。

参考 编辑