Entity Framework Core

开发方式

Entity Framework Core 的开发方式与原有Entity Framework 不同的是，Entity Framework Core 不再支持以UI 为主的数据库配置(这是为了要适应Linux 与 Mac 的开发环境)，且不论是何种模式(Database First / Code First)，都是以代码为主的环境对应，不再有EDMX (Entity Framework Metadata) 存在，为达成这个目标，Entity Framework 提供了Scaffold-Database 指令 (于 Package Management Console 中运行)，允许开发人员由数据库来产生Model 的代码。
Scaffold-DbContext "'Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;''" Microsoft.EntityFrameworkCore.SqlServer
原本 Entity Framework 现有的数据模型同步指令Add-Migration 与 Update-Database 在 Entity Framework Core 仍然支持，包含前述的Scaffold-Database 指令，都被包装在Microsoft.EntityFrameworkCore.Tools 包内，可以由Package Management Console 中运行Install-Package 安装它，或是直接编辑project.json 将它加入相依包，然后再于project.json 中加入工具的相关设置：
1   "tools": {2     "Microsoft.EntityFrameworkCore.Tools": {3       "version": "1.0.0-preview1-final",4       "imports": [5         "portable-net45+win8+dnxcore50",6         "portable-net45+win8"7       ]8     }
若是使用Scaffold-Database 指令探测数据库时，除了 Model 会自动产生外，也会一并产生DbContext 类别的派生程序，作为链接数据库的入口，若是由新数据库，或是未使用Scaffold-Database 指令的话，就要自行撰写这个类别。
 1 using Microsoft.EntityFrameworkCore; 2 using Microsoft.EntityFrameworkCore.Metadata; 3  4 namespace EFGetStarted.AspNetCore.ExistingDb.Models 5 { 6     public partial class BloggingContext : DbContext 7     { 8         protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 9         {10         }11 12         protected override void OnModelCreating(ModelBuilder modelBuilder)13         {14             modelBuilder.Entity<Blog>(entity =>15             {16                 entity.Property(e => e.Url).IsRequired();17             });18 19             modelBuilder.Entity<Post>(entity =>20             {21                 entity.HasOne(d => d.Blog)22                     .WithMany(p => p.Post)23                     .HasForeignKey(d => d.BlogId);24             });25         }26 27         public virtual DbSet<Blog> Blog { get; set; }28         public virtual DbSet<Post> Post { get; set; }29     }30 }
就可以使用DbContext 来操作数据库了，之后的部分就和Entity Framework 差异不大。 若是 ASP.NET Core，则需再到ASP.NET Core 的起始类别(例如 Startup.cs)，将 Entity Framework Core 的 DbContext 加到Dependency Injection 里面。
1 public void ConfigureServices(IServiceCollection services)2 {3     var connection = @"Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;";4     services.AddDbContext<BloggingContext>(options => options.UseSqlServer(connection));5     // ...6 }
之后就可以由Controller 获取这个DbContext 进行数据访问的动作了，例如：
 1 using EFGetStarted.AspNetCore.ExistingDb.Models; 2 using Microsoft.AspNetCore.Mvc; 3 using System.Linq; 4  5 namespace EFGetStarted.AspNetCore.ExistingDb.Controllers 6 { 7     public class BlogsController : Controller 8     { 9         private BloggingContext _context;10 11         public BlogsController(BloggingContext context)12         {13             _context = context;14         }15 16         public IActionResult Index()17         {18             return View(_context.Blog.ToList());19         }20 21         public IActionResult Create()22         {23             return View();24         }25 26         [HttpPost]27         [ValidateAntiForgeryToken]28         public IActionResult Create(Blog blog)29         {30             if (ModelState.IsValid)31             {32                 _context.Blog.Add(blog);33                 _context.SaveChanges();34                 return RedirectToAction("Index");35             }36 37             return View(blog);38         }39 40     }41 }