ASP.NET Core - DBContext

ASP.NET Core - DBContext 首页 / ASP.Net Core入门教程 / ASP.NET Core - DBContext

实体框架(Entity Framework)使您可以使用称为实体的公共语言运行时(CLR)对象查询,插入,更新和删除数据。实体框架将模型中定义的实体和关系映射到数据库。

负责与数据作为对象进行交互的主要类是DbContext。建议使用Context的方法是定义一个类,该类派生自DbContext并暴露DbSet属性,这些属性表示Context中指定实体的集合。

DBContext

从逻辑上讲,DBContext映射到具有DBContext可以理解的架构的特定数据库,在该DBContext类上,您可以创建DbSet <T>类型的属性,通用类型参数T将是一种实体类型,例如Employee是FirstAppDemo应用程序中的实体。

让无涯教程举一个简单的示例,其中将创建一个DbContext类,在这里,需要在Models文件夹中添加一个新类,并将其命名为 FirstAppDempDbContext 。即使此类本身不是模型,它也会将所有模型组合在一起,以便可以将其与数据库一起使用。

FirstAppDemo Context

从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(); 
         
         using (var context = new FirstAppDemoDbContext()) { 
            SQLEmployeeData sqlData = new SQLEmployeeData(context); 
               model.Employees = sqlData.GetAll(); 
         }  
         return View(model); 
      } 
   }  
   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 
         
         FirstAppDemoDbContext()) { 
            SQLEmployeeData sqlData = new SQLEmployeeData(context); 
            sqlData.Add(employee); 
         } 
         
         //var employee=new Employee { ID=1, Name="Mark Upston" }; 
         return View(employee); 
      } 
   }  
   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开发人员命令提示符,以运行添加迁移和应用迁移所需的命令。最简单的方法是转到应用程序根目录。

Developer Command Prompt

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

现在使用以下命令。

dnvm list 

按下回车键时,您将看到以下输出。

Output in Command Prompt

需要告诉 dnvm 要使用特定的运行时,这将使能够访问要执行的dotnet命令或dnx命令。

执行以下命令。

dnvm use1.0.0-rc1-update1 -p

按回车键。

DNVM

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

DNX EF Command

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

首先,需要添加迁移以执行以下命令。

dnx ef migrations add v1

按回车键。

DNX EF Migrations

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

Entity Framework

迁移本质上是一个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.CreateTable(name: "Employee", columns: table => new { 
            Id = table.Column<int>(nullable: false)    
               .Annotation("SqlServer:ValueGenerationStrategy",
               SqlServerValueGenerationStrategy.IdentityColumn),                        
               Name = table.Column<string>(nullable: true) 
         }, 
         constraints: table => { 
            table.PrimaryKey("PK_Employee", x => x.Id); 
         }); 
      }  
      protected override void Down(MigrationBuilder migrationBuilder) { 
         migrationBuilder.DropTable("Employee"); 
      } 
   } 
}

您可以看到它将创建一个名为Employees的表。

  • 此表应具有两列-ID和Name列。

  • 按照惯例,当实体框架看到您具有称为Id的属性时,它将使该属性成为数据库中的主键。

  • 在这里,将使用SQL Server,默认情况下,实体框架将创建一个IdentityColumn,这意味着SQL Server将生成ID。

通过键入" dnx ef database update"命令将这些ID应用于数据库。

DNX EF Database Update

您可以看到该命令已应用迁移。

现在转到SQL Server Object Explorer,并刷新数据库,现在您可以看到无涯教程有一个FirstAppDemo数据库。

SQL Server对象Explore

您还可以看到Employee表,甚至可以查看该表的列,其中ID列是主键。

右键单击dbo.Employee表,然后选择"View Data"。

DBO Employee

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

在这里添加几行数据。

Couple Of Rows Data

现在更新index.cshtml文件。它以表格形式显示所有数据。

@model FirstAppDemo.Controllers.HomePageViewModel 
<html xmlns="http://www.w3.org/1999/xhtml"> 
   <head> 
       <title>Home</title> 
   </head> 

   <body> 
      <h1>Welcome!</h1> 
      
      <table> 
         @foreach (var employee in Model.Employees) { 
            <tr> 
               <td>   
                  @Html.ActionLink(employee.Id.ToString(), "Details", new 
                     { id = employee.Id }) 
               </td> 
               <td>@employee.Name</td> 
            </tr> 
         } 
      </table> 
   </body> 
</html>

一旦运行该应用程序,它将产生以下输出。

Final Output

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

推荐系统三十六式 -〔刑无刀〕

安全攻防技能30讲 -〔何为舟〕

Vim 实用技巧必知必会 -〔吴咏炜〕

Go 语言项目开发实战 -〔孔令飞〕

快手 · 音视频技术入门课 -〔刘歧〕

JavaScript进阶实战课 -〔石川〕

Vue 3 企业级项目实战课 -〔杨文坚〕

运维监控系统实战笔记 -〔秦晓辉〕

B端体验设计入门课 -〔林远宏(汤圆)〕

好记忆不如烂笔头。留下您的足迹吧 :)