猿教程 Logo

Asp.Net Core-DBContext

实体框架允许您直接使用实体来查询、插入、更新和删除数据。 实体框架将在模型中定义的实体和关系映射到数据库。 它还提供以下设施 -

  • 将从数据库返回的数据实体化为实体对象。

  • 跟踪对对象所做的更改。

  • 处理并发。

  • 将对象更改传回数据库。

  • 将对象绑定到控件。

负责与数据作为对象交互的主类是DbContext。 推荐使用上下文的方法是定义一个从DbContext派生的类,并暴露表示上下文中指定实体的集合的DbSet属性。


逻辑上,DBContext映射到具有DBContext理解的模式的特定数据库。 并且在该DBContext类上,您可以创建类型为DbSet


案例

让我们举一个简单的例子,其中我们将创建一个DbContext类。 这里,我们需要在Models文件夹中添加一个新类,并将其称为FirstAppDempDbContext。 这个类本身不是一个模型,但它把所有的模型放在一起,以便我们可以使用它们来操作数据库。


从Miscrosoft.Data.Entity命名空间中的DbContext类来继承您的上下文类。 现在在该类上实现Employee的DbSet。

每个DbSet将映射到数据库中的一个表。 如果您有一个employee的Dbset属性,并且该属性的名称是Employees,Entity Framework将默认在数据库中查找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类添加一个新类来简化这些操作,在该类中我们实现了添加employee和获取 employee的方法,如下面的程序所示。

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对象,然后它将保存更改。 在Get方法中,它将返回一个基于ID的employee信息。 而在GetAll方法中,它将返回数据库中所有员工的列表。


配置Entity Framework服务

要有一个可用的Entity Framework DBContext,我们还需要改变应用程序的配置。 我们需要添加一个连接字符串,以便我们的DBContext知道要去哪个服务器以及要查询哪个数据库。

  • 我们将把连接字符串放在一个JSON配置文件中。

  • 我们还需要在Startup类的ConfigureServices方法中添加一些服务。

  • 实体框架,就像ASP.NET和MVC框架一样,Entity框架依赖于依赖注入,并且对于注入工作,运行时需要知道Entity Framework使用的各种服务。

  • 有一个简单的配置API,将添加我们需要的所有默认服务。

让我们转到AppSettings.json文件并添加连接字符串,如下面的程序所示。

{ 
   "message": "Hello, World! this message is from configuration file...", 
   "database": { 
      "connection": "Data Source=(localdb)\\mssqllocaldb;Initial Catalog=FirstAppDemo" 
   } 
}

现在让我们进入Startup类,我们需要为Entity Framework添加一些额外的服务才能正常工作。 具体来说,我们需要做的三件与实体框架相关的事情 -

  • 我们需要添加核心实体框架服务。

  • 我们还需要添加 SQL Server 相关实体框架服务。

  • 我们需要告诉实体框架我们的DBContext。

所有这些都可以通过在IServiceCollection上作为扩展方法的方法来实现,如下面的程序所示。

public void ConfigureServices(IServiceCollection services) { 
   services.AddMvc(); 
   services.AddEntityFramework() 
      .AddSqlServer() 
      .AddDbContext<FirstAppDemoDbContext>
   
   (option => option.UseSqlServer(Configuration["database:connection"])); 
}


  • 第一种方法是AddEntityFramework。这将添加核心Entity Framework服务,默认服务。

  • 但是由于实体框架现在设计为使用不同类型的数据库(包括非关系数据库),我们需要进行第二次调用,告诉Entity Framework添加其默认的SQL Server相关服务。

  • 然后我们还需要告诉实体框架我的DBContext类,这样它可以适当地构造该类的实例,我们可以通过第三个方法,AddDbContext方法。

  • 这一个采用通用类型参数,其中我们指定DBContext派生类的类型FirstAppDemoDbContext。

  • 在AddDbContext中,我们需要描述我们的DBContext的选项。

  • 这可以通过lambda表达式完成;它是一个动作,其中我们接收一个选项参数,实体框架可以支持不同的数据库。我们需要做的是,告诉Entity框架这个特定的DBContext将要使用UseSqlServer。

  • 此方法需要一个参数,即要使用的connectionString。

以下是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的开发人员命令提示符,来运行我们添加迁移和应用迁移所需的命令。 最简单的方法是转到应用程序根目录。


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

让我们现在使用以下命令。

dnvm list

当您按Enter键时,将会看到以下输出。


我们需要告诉dnvm我们想使用特定的运行时。 这将让我们访问我们要执行的dotnet命令或dnx命令。

执行以下命令。

dnvm use1.0.0-rc1-update1 -p

按Enter键。


dnvm将设置我们的路径和环境变量以包括一个bin目录,这将使我们能够访问此dnx实用程序。 让我们执行dnx ef命令。


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

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

dnx ef migrations add v1

按Enter键。


实体框架将找到上下文并查看内部的模型。 它将知道没有先前的迁移,因此它将生成第一个迁移。 这里,v1是数据库的版本1。 它将在解决方案资源管理器中创建一个新文件夹并生成代码。


迁移本质上是一个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和一个名称列。

  • 按照惯例,当Entity Framework看到你有一个称为Id的属性时,它将创建该属性,或者使该列成为数据库中的主键。

  • 这里,我们将使用SQL Server。 默认情况下,Entity Framework将创建一个IdentityColumn,这意味着SQL Server将为我们生成ID。

让我们通过键入“dnx ef database update”命令将这些ID应用到数据库。


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

现在让我们转到SQL Server对象资源管理器并刷新数据库,可以看到我们有一个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> 
      
      <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>

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



版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/ASPNET-CORE/core-dbcontext.html