比较 EF Core 和 EF6

安装包NuGet

Microsoft.EntityFrameworkCore:EF的核心包 Microsoft.EntityFrameworkCore.SqlServer:要使用SqlServer就要安装这个包,还有其他类型的数据库

从数据库生成模型

需要安装包

Microsoft.EntityFrameworkCore.Tools

在程序包管理器控制台输入以下命令
更多命令:Entity Framework Core 工具参考-Visual Studio 中的包管理器控制台

  1. Scaffold-DbContext "Server=.;Database=TestORM;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models

image.png

从代码生成

创建实体对象类

.NET Framework EF三种创建方式 Code First 创建实体对象类

创建上下文类

  1. using Microsoft.EntityFrameworkCore;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Threading.Tasks;
  6. namespace EFcoremvc.Models
  7. {
  8. public class TestORMContext:DbContext
  9. {
  10. public TestORMContext(DbContextOptions<TestORMContext> options):base(options)
  11. {
  12. }
  13. public DbSet<Students> Students { get; set; }
  14. public DbSet<Sex> Sex { get; set; }
  15. }
  16. }

注册服务

在Startup类中注册服务。
需要引用using Microsoft.EntityFrameworkCore;

我们可以使用AddDbContext()或AddDbContextPool()方法向ASP.NET Core依赖注入容器中注册程序中的DbContext类。AddDbContext()和AddDbContextPool()方法的区别在于,AddDbContextPool()方法提供了数据库连接。 推荐使用AddDbContextPool()方法

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. //注册一个sql server服务,使用自定义的名字connString的连接字符串,这个连接字符串在appsettings.json配置文件里面
  4. services.AddDbContextPool<TestORMContext>(
  5. options=>options.UseSqlServer(Configuration.GetConnectionString("connString")));
  6. services.AddControllersWithViews();
  7. }

mysql的不同点

mysql需要装Pomelo.EntityFrameworkCore.MySql

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. //mysql的连接方式,两个参数,一个连接字符串,一个数据库版本
  4. services.AddDbContext<Blog6Context>(p => p.UseMySql(Configuration.GetConnectionString("connMySql"), ServerVersion.AutoDetect(Configuration.GetConnectionString("connMySql"))));
  5. services.AddControllersWithViews();
  6. services.AddRazorPages();
  7. }

连接字符串

我们不需要在应用程序代码中对连接字符串进行硬编码,而是将其存储在appsettings.json配置文件中
ConnectionStrings

  1. {
  2. "Logging": {
  3. "LogLevel": {
  4. "Default": "Information",
  5. "Microsoft": "Warning",
  6. "Microsoft.Hosting.Lifetime": "Information"
  7. }
  8. },
  9. "AllowedHosts": "*",
  10. "ConnectionStrings": {
  11. "connString": "Server=.;Database=TestORM;Trusted_Connection=True;"
  12. }
  13. }

迁移/创建数据库

安装:Microsoft.EntityFrameworkCore.Tools

  1. 在程序包管理控制台,输入Add-Migration Init,添加迁移,Init是随便起的名字。

image.png
成功后程序自动给我创建的
image.png

  1. 现在我们需要执行迁移代码来创建表。如果数据库尚不存在,则会先创建数据库,然后创建数据库表。为了更新数据库,我们使用Update-Database命令。对于Update-Database命令,我们可以指定想要执行的迁移名称。如果未指定迁移,则默认情况下该命令将执行上次迁移记录,即Init迁移记录

image.png
这时候数据库里面就创建好了
image.png

如果数据库架构要更改,不要直接改数据库表,直接改项目的数据实体类,然后添加新的迁移,修改迁移

种子数据

添加种子数据

相当于测试数据。
我们在应用程序DbContext类中重写OnModelCreating()方法

  1. using Microsoft.EntityFrameworkCore;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Threading.Tasks;
  6. namespace EFcoremvc.Models
  7. {
  8. public class TestORMContext:DbContext
  9. {
  10. public TestORMContext(DbContextOptions<TestORMContext> options):base(options)
  11. {
  12. }
  13. public DbSet<Students> Students { get; set; }
  14. public DbSet<Sex> Sex { get; set; }
  15. //重写方法
  16. protected override void OnModelCreating(ModelBuilder modelBuilder)
  17. {
  18. modelBuilder.Entity<Sex>().HasData(
  19. new Sex()
  20. {
  21. Sex_id=1,
  22. Sex_name="男"
  23. }
  24. );
  25. modelBuilder.Entity<Sex>().HasData(
  26. new Sex()
  27. {
  28. Sex_id = 2,
  29. Sex_name = "女"
  30. }
  31. );
  32. modelBuilder.Entity<Students>().HasData(
  33. new Students()
  34. {
  35. Stu_id=1,
  36. Stu_name="张三",
  37. Stu_sexid=1,
  38. Stu_money=123.321m
  39. }
  40. );
  41. }
  42. }
  43. }

现在我们将这些种子数据添加到数据库中。首先要添加一条新的迁移记录Add-Migration data1
image.png
然后更新这个迁移记录Update-Database data1
image.png
然后数据库表里面就有了这些数据,迁移记录表多了一条记录
image.png
image.png

更新种子数据

  1. protected override void OnModelCreating(ModelBuilder modelBuilder)
  2. {
  3. modelBuilder.Entity<Sex>().HasData(
  4. new Sex()
  5. {
  6. Sex_id=1,
  7. Sex_name="人妖"
  8. }
  9. );
  10. }

执行添加迁移Add-Migration,更新迁移Update-Database

这个修改不是普通意义上的修改id为1的Sex数据,种子数据是直接重新覆盖原表的数据,这条种子数据执行完,数据表是这样的
image.png

迁移数据回滚等

每次添加迁移,都会创建一条记录。

第一个文件是[TimeStap]_[name].cs,文件名由时间戳、下划线和定义的迁移名称组成。此文件中的类名与迁移名称相同,该类包含的两个方法分别是Up()和Down()。
● Up()方法包含对领域类所做的更改,并会将它们应用到数据库架构中的代码。
● Down()方法包含撤销更改的代码。

第二个文件是ModelSnapshot.cs,文件名由当前自定义的DbContext名称和ModelSnapshot组成,顾名思义,此文件包含当前模型的快照。在创建第一条迁移记录时,该文件将被添加到Migrations文件夹中,并在以后的每次迁移中得到更新,它使数据库与模型保持最新所需的更改。当添加第一条迁移记录并在后续每次迁移发生更新时,都将创建此文件。EF Core迁移API会使用此文件来确定添加下一次迁移时已更改的内容。
现在我们要应用迁移并更新数据库,请使用Update-Database命令。此命令执行Up()方法中的代码,并将更改应用到数据库中。
image.png
要删除迁移,需要执行Remove-Migration命令。它一次只删除一条迁移记录,并且仅删除尚未应用到数据库的最新迁移记录。如果已应用迁移记录,则强制执行Remove-Migration命令将引发异常。

如果ABC三个迁移已经更新数据库,现在要撤销BC的迁移,执行Update-Database A,后面的两个BC就撤销了