安装包NuGet
Microsoft.EntityFrameworkCore:EF的核心包 Microsoft.EntityFrameworkCore.SqlServer:要使用SqlServer就要安装这个包,还有其他类型的数据库
从数据库生成模型
需要安装包
Microsoft.EntityFrameworkCore.Tools
在程序包管理器控制台输入以下命令
更多命令:Entity Framework Core 工具参考-Visual Studio 中的包管理器控制台
Scaffold-DbContext "Server=.;Database=TestORM;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models
从代码生成
创建实体对象类
创建上下文类
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace EFcoremvc.Models
{
public class TestORMContext:DbContext
{
public TestORMContext(DbContextOptions<TestORMContext> options):base(options)
{
}
public DbSet<Students> Students { get; set; }
public DbSet<Sex> Sex { get; set; }
}
}
注册服务
在Startup类中注册服务。
需要引用using Microsoft.EntityFrameworkCore;
我们可以使用AddDbContext()或AddDbContextPool()方法向ASP.NET Core依赖注入容器中注册程序中的DbContext类。AddDbContext()和AddDbContextPool()方法的区别在于,AddDbContextPool()方法提供了数据库连接。 推荐使用AddDbContextPool()方法
public void ConfigureServices(IServiceCollection services)
{
//注册一个sql server服务,使用自定义的名字connString的连接字符串,这个连接字符串在appsettings.json配置文件里面
services.AddDbContextPool<TestORMContext>(
options=>options.UseSqlServer(Configuration.GetConnectionString("connString")));
services.AddControllersWithViews();
}
mysql的不同点
mysql需要装Pomelo.EntityFrameworkCore.MySql
包
public void ConfigureServices(IServiceCollection services)
{
//mysql的连接方式,两个参数,一个连接字符串,一个数据库版本
services.AddDbContext<Blog6Context>(p => p.UseMySql(Configuration.GetConnectionString("connMySql"), ServerVersion.AutoDetect(Configuration.GetConnectionString("connMySql"))));
services.AddControllersWithViews();
services.AddRazorPages();
}
连接字符串
我们不需要在应用程序代码中对连接字符串进行硬编码,而是将其存储在appsettings.json配置文件中
ConnectionStrings
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"connString": "Server=.;Database=TestORM;Trusted_Connection=True;"
}
}
迁移/创建数据库
安装:Microsoft.EntityFrameworkCore.Tools
- 在程序包管理控制台,输入
Add-Migration Init
,添加迁移,Init是随便起的名字。
成功后程序自动给我创建的
- 现在我们需要执行迁移代码来创建表。如果数据库尚不存在,则会先创建数据库,然后创建数据库表。为了更新数据库,我们使用
Update-Database
命令。对于Update-Database命令,我们可以指定想要执行的迁移名称。如果未指定迁移,则默认情况下该命令将执行上次迁移记录,即Init迁移记录
这时候数据库里面就创建好了
如果数据库架构要更改,不要直接改数据库表,直接改项目的数据实体类,然后添加新的迁移,修改迁移
种子数据
添加种子数据
相当于测试数据。
我们在应用程序DbContext类中重写OnModelCreating()方法
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace EFcoremvc.Models
{
public class TestORMContext:DbContext
{
public TestORMContext(DbContextOptions<TestORMContext> options):base(options)
{
}
public DbSet<Students> Students { get; set; }
public DbSet<Sex> Sex { get; set; }
//重写方法
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Sex>().HasData(
new Sex()
{
Sex_id=1,
Sex_name="男"
}
);
modelBuilder.Entity<Sex>().HasData(
new Sex()
{
Sex_id = 2,
Sex_name = "女"
}
);
modelBuilder.Entity<Students>().HasData(
new Students()
{
Stu_id=1,
Stu_name="张三",
Stu_sexid=1,
Stu_money=123.321m
}
);
}
}
}
现在我们将这些种子数据添加到数据库中。首先要添加一条新的迁移记录Add-Migration data1
然后更新这个迁移记录Update-Database data1
然后数据库表里面就有了这些数据,迁移记录表多了一条记录
更新种子数据
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Sex>().HasData(
new Sex()
{
Sex_id=1,
Sex_name="人妖"
}
);
}
执行添加迁移Add-Migration,更新迁移Update-Database
这个修改不是普通意义上的修改id为1的Sex数据,种子数据是直接重新覆盖原表的数据,这条种子数据执行完,数据表是这样的
迁移数据回滚等
每次添加迁移,都会创建一条记录。
第一个文件是[TimeStap]_[name].cs,文件名由时间戳、下划线和定义的迁移名称组成。此文件中的类名与迁移名称相同,该类包含的两个方法分别是Up()和Down()。
● Up()方法包含对领域类所做的更改,并会将它们应用到数据库架构中的代码。
● Down()方法包含撤销更改的代码。
第二个文件是ModelSnapshot.cs,文件名由当前自定义的DbContext名称和ModelSnapshot组成,顾名思义,此文件包含当前模型的快照。在创建第一条迁移记录时,该文件将被添加到Migrations文件夹中,并在以后的每次迁移中得到更新,它使数据库与模型保持最新所需的更改。当添加第一条迁移记录并在后续每次迁移发生更新时,都将创建此文件。EF Core迁移API会使用此文件来确定添加下一次迁移时已更改的内容。
现在我们要应用迁移并更新数据库,请使用Update-Database
命令。此命令执行Up()方法中的代码,并将更改应用到数据库中。
要删除迁移,需要执行Remove-Migration
命令。它一次只删除一条迁移记录,并且仅删除尚未应用到数据库的最新迁移记录。如果已应用迁移记录,则强制执行Remove-Migration命令将引发异常。
如果ABC三个迁移已经更新数据库,现在要撤销BC的迁移,执行Update-Database A
,后面的两个BC就撤销了