实体框架(Entity Framework)使您可以使用称为实体的公共语言运行时(CLR)对象查询,插入,更新和删除数据。实体框架将模型中定义的实体和关系映射到数据库。
负责与数据作为对象进行交互的主要类是DbContext。建议使用Context的方法是定义一个类,该类派生自DbContext并暴露DbSet属性,这些属性表示Context中指定实体的集合。

从逻辑上讲,DBContext映射到具有DBContext可以理解的架构的特定数据库,在该DBContext类上,您可以创建DbSet <T>类型的属性,通用类型参数T将是一种实体类型,例如Employee是FirstAppDemo应用程序中的实体。
让无涯教程举一个简单的示例,其中将创建一个DbContext类,在这里,需要在Models文件夹中添加一个新类,并将其命名为 FirstAppDempDbContext 。即使此类本身不是模型,它也会将所有模型组合在一起,以便可以将其与数据库一起使用。

从Microsoft.Data.Entity命名空间中的DbContext类继承Context类。现在,在该类上实现Employee的DbSet。
每个DbSet都将映射到数据库中的一个表,如果您有一个名为employee的属性DbSet,并且该属性的名称为Employees,则默认情况下,实体框架将在数据库中查找Employees表。
using FirstAppDemo.Models; using Microsoft.Data.Entity;using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks;
namespace OdeToFood.Models { public class FirstAppDemoDbContext : DbContext { public DbSet<Employee> Employees { get; set; } } }
实现非常简单,因为只有一个模型可以使用,只需要一个属性,即Employee的 DbSet ,可以将该属性命名为 Employees 。
现在,将此类直接插入控制器中,然后控制器可以使用 FirstAppDemoDbContext 查询数据库,将通过在HomeController类中添加一个新类来简化所有这些操作,在该类中实现添加雇员和获取雇员的方法,如以下程序所示。
using Microsoft.AspNet.Mvc;
using FirstAppDemo.ViewModels;
using FirstAppDemo.Services;
using FirstAppDemo.Entities;
using FirstAppDemo.Models;
using System.Collections.Generic;
using System.Linq;
namespace FirstAppDemo.Controllers {
public class HomeController : Controller {
public ViewResult Index() {
var model = new HomePageViewModel();
</span><span class="kwd">using</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">var</span><span class="pln"> context </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">FirstAppDemoDbContext</span><span class="pun">())</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="typ">SQLEmployeeData</span><span class="pln"> sqlData </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">SQLEmployeeData</span><span class="pun">(</span><span class="pln">context</span><span class="pun">);</span><span class="pln">
model</span><span class="pun">.</span><span class="typ">Employees</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> sqlData</span><span class="pun">.</span><span class="typ">GetAll</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> </span><span class="typ">View</span><span class="pun">(</span><span class="pln">model</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
}
public class SQLEmployeeData {
private FirstAppDemoDbContext _context { get; set; }
public SQLEmployeeData(FirstAppDemoDbContext context) {
_context = context;
}
public void Add(Employee emp) {
_context.Add(emp);
_context.SaveChanges();
}
public Employee Get(int ID) {
return _context.Employees.FirstOrDefault(e => e.Id == ID);
}
public IEnumerable<Employee> GetAll() {
return _context.Employees.ToList<Employee>();
}
}
public class HomePageViewModel {
public IEnumerable<Employee> Employees { get; set; }
}
}
在上面的SQLEmployeeData类中,您可以看到定义了Add方法,该方法会将一个新的employee对象添加到Context中,然后将其保存。在Get方法中,它将根据ID返回一个雇员,而在GetAll方法中,它将返回数据库中所有雇员的列表。
配置实体框架服务
要拥有可用的Entity Framework DBContext,无涯教程需要更改应用程序的配置,将需要添加一个连接字符串,以便DBContext知道要转到哪个服务器以及要查询哪个数据库。
将连接字符串放入JSON配置文件中。
还需要在Startup类的ConfigureServices方法期间添加一些其他服务。
与ASP.NET和MVC框架一样,实体框架也依赖于依赖项注入,并且要使注入工作正常运行,运行时需要了解实体框架使用的各种服务。
有一个简单的配置API,它将添加需要的所有默认服务。
转到AppSettings.json文件并添加连接字符串,如以下程序所示。
{ "message": "Hello, World! this message is from configuration file...", "database": { "connection": "Data Source=(localdb)\\mssqllocaldb;Initial Catalog=FirstAppDemo" } }
现在转到Startup类,在这里需要添加一些其他服务以使Entity Framework正常工作。
所有这些都可以通过在 IServiceCollection 上作为扩展方法可用的方法来完成,如以下程序所示。
public void ConfigureServices(IServiceCollection services) { services.AddMvc(); services.AddEntityFramework() .AddSqlServer() .AddDbContext<FirstAppDemoDbContext>(option => option.UseSqlServer(Configuration["database:connection"])); }
以下是 Startup.cs 文件的完整实现。
using Microsoft.AspNet.Mvc;
using FirstAppDemo.ViewModels;
using FirstAppDemo.Services;
using FirstAppDemo.Entities;
using FirstAppDemo.Models;
using System.Collections.Generic;
using System.Linq;
namespace FirstAppDemo.Controllers {
public class HomeController : Controller {
public ViewResult Index() {
var employee = new Employee { Id = 1, Name = "Mark Upston1" };
using (var context = new
</span><span class="typ">FirstAppDemoDbContext</span><span class="pun">())</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="typ">SQLEmployeeData</span><span class="pln"> sqlData </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">SQLEmployeeData</span><span class="pun">(</span><span class="pln">context</span><span class="pun">);</span><span class="pln">
sqlData</span><span class="pun">.</span><span class="typ">Add</span><span class="pun">(</span><span class="pln">employee</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="com">//var employee=new Employee { ID=1, Name="Mark Upston" }; </span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> </span><span class="typ">View</span><span class="pun">(</span><span class="pln">employee</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
}
public class SQLEmployeeData {
private FirstAppDemoDbContext _context { get; set; }
public SQLEmployeeData(FirstAppDemoDbContext context) {
_context = context;
}
public void Add(Employee emp) {
_context.Add(emp);
_context.SaveChanges();
}
public Employee Get(int ID) {
return _context.Employees.FirstOrDefault(e => e.Id == ID);
}
public IEnumerable<Employee> GetAll() {
return _context.Employees.ToList<Employee>();
}
}
}
现在需要创建数据库,创建数据库的一种方法是使用实体框架创建数据库,这是一个两步过程-
第一步
这涉及以下内容-
向项目添加迁移代码。
迁移代码是 C#代码,可以执行此操作以在数据库模式中创建数据库。
实体框架可以为生成此迁移代码。
实体框架查看数据库和模型,并弄清楚需要进行哪些模式更改才能使应用程序正常工作。
因此,当无涯教程添加其他模型或对现有模型(如Employee类)进行更改时,可以继续向项目中添加迁移,并使数据库架构保持同步。
第二步
这涉及以下内容-
在这里,需要显式应用这些迁移来更新数据库。
可以通过从控制台窗口使用一些简单的命令来完成这两项任务。
已经制作了project.json。
这就是为什么制作project.json来添加命令,其中" ef"映射到EntityFramework.Commands。
打开Visual Studio开发人员命令提示符,以运行添加迁移和应用迁移所需的命令。最简单的方法是转到应用程序根目录。

如果您位于具有project.json文件的文件夹中,那么您位于正确的文件夹中,在这里,需要执行一个称为dnvm的命令,这是.NET版本管理器,它将告诉系统要使用的运行时。
现在使用以下命令。
dnvm list
按下回车键时,您将看到以下输出。

需要告诉 dnvm 要使用特定的运行时,这将使能够访问要执行的dotnet命令或dnx命令。
执行以下命令。
dnvm use1.0.0-rc1-update1 -p
按回车键。

dnvm 将设置路径和环境变量,以包含一个bin目录,该目录可让访问此dnx实用程序,执行 dnx ef 命令。

这是.NET执行环境,使用dnx,可以调用在project.json文件中列出的命令,通常,执行这些命令非常容易,键入dnx ef时,将显示帮助屏幕,您不必记住所有选项。您可以从"Entity Framework Commands"中看到可用的命令,其中有三个。
首先,需要添加迁移以执行以下命令。
dnx ef migrations add v1
按回车键。

实体框架将找到该Context并查看其中的模型,它将知道没有先前的迁移,因此它将生成第一个迁移,在此,v1是数据库的版本1。它将在Solution Explorer中创建一个新文件夹并生成代码。

迁移本质上是一个C#代码,用于生成SQL命令以修改SQL数据库中的架构。
using System;
using System.Collections.Generic;
using Microsoft.Data.Entity.Migrations;
using Microsoft.Data.Entity.Metadata;
namespace FirstAppDemo.Migrations {
public partial class v1 : Migration {
protected override void Up(MigrationBuilder migrationBuilder) {
migrationBuilder</span><span class="pun">.</span><span class="typ">CreateTable</span><span class="pun">(</span><span class="pln">name</span><span class="pun">:</span><span class="pln"> </span><span class="str">"Employee"</span><span class="pun">,</span><span class="pln"> columns</span><span class="pun">:</span><span class="pln"> table </span><span class="pun">=></span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="typ">Id</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> table</span><span class="pun">.</span><span class="typ">Column</span><span class="str"><int></span><span class="pun">(</span><span class="pln">nullable</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">)</span><span class="pln">
</span><span class="pun">.</span><span class="typ">Annotation</span><span class="pun">(</span><span class="str">"SqlServer:ValueGenerationStrategy"</span><span class="pun">,</span><span class="pln">
</span><span class="typ">SqlServerValueGenerationStrategy</span><span class="pun">.</span><span class="typ">IdentityColumn</span><span class="pun">),</span><span class="pln">
</span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> table</span><span class="pun">.</span><span class="typ">Column</span><span class="str"><string></span><span class="pun">(</span><span class="pln">nullable</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">)</span><span class="pln">
</span><span class="pun">},</span><span class="pln">
constraints</span><span class="pun">:</span><span class="pln"> table </span><span class="pun">=></span><span class="pln"> </span><span class="pun">{</span><span class="pln">
table</span><span class="pun">.</span><span class="typ">PrimaryKey</span><span class="pun">(</span><span class="str">"PK_Employee"</span><span class="pun">,</span><span class="pln"> x </span><span class="pun">=></span><span class="pln"> x</span><span class="pun">.</span><span class="typ">Id</span><span class="pun">);</span><span class="pln">
</span><span class="pun">});</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">override</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Down</span><span class="pun">(</span><span class="typ">MigrationBuilder</span><span class="pln"> migrationBuilder</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
migrationBuilder</span><span class="pun">.</span><span class="typ">DropTable</span><span class="pun">(</span><span class="str">"Employee"</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
}
}
您可以看到它将创建一个名为Employees的表。
此表应具有两列-ID和Name列。
按照惯例,当实体框架看到您具有称为Id的属性时,它将使该属性成为数据库中的主键。
在这里,将使用SQL Server,默认情况下,实体框架将创建一个IdentityColumn,这意味着SQL Server将生成ID。
通过键入" dnx ef database update"命令将这些ID应用于数据库。

您可以看到该命令已应用迁移。
现在转到SQL Server Object Explorer,并刷新数据库,现在您可以看到无涯教程有一个FirstAppDemo数据库。

您还可以看到Employee表,甚至可以查看该表的列,其中ID列是主键。
右键单击dbo.Employee表,然后选择"View Data"。

在运行应用程序之前,添加一些数据。启动应用程序时,应该从数据库中看到一些数据。
在这里添加几行数据。

现在更新index.cshtml文件。它以表格形式显示所有数据。
@model FirstAppDemo.Controllers.HomePageViewModel
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Home</title>
</head>
<body>
<h1>Welcome!</h1>
</span><span class="str"><table></span><span class="pln">
</span><span class="lit">@foreach</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">var</span><span class="pln"> employee </span><span class="kwd">in</span><span class="pln"> </span><span class="typ">Model</span><span class="pun">.</span><span class="typ">Employees</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="str"><tr></span><span class="pln">
</span><span class="str"><td></span><span class="pln">
</span><span class="lit">@Html</span><span class="pun">.</span><span class="typ">ActionLink</span><span class="pun">(</span><span class="pln">employee</span><span class="pun">.</span><span class="typ">Id</span><span class="pun">.</span><span class="typ">ToString</span><span class="pun">(),</span><span class="pln"> </span><span class="str">"Details"</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">new</span><span class="pln">
</span><span class="pun">{</span><span class="pln"> id </span><span class="pun">=</span><span class="pln"> employee</span><span class="pun">.</span><span class="typ">Id</span><span class="pln"> </span><span class="pun">})</span><span class="pln">
</span><span class="pun"></</span><span class="pln">td</span><span class="pun">></span><span class="pln">
</span><span class="str"><td></span><span class="lit">@employee</span><span class="pun">.</span><span class="typ">Name</span><span class="pun"></</span><span class="pln">td</span><span class="pun">></span><span class="pln">
</span><span class="pun"></</span><span class="pln">tr</span><span class="pun">></span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun"></</span><span class="pln">table</span><span class="pun">></span><span class="pln">
</body>
</html>
一旦运行该应用程序,它将产生以下输出。