通过数据库上下文可以配置实体和数据库表之间的映射关系,并且可以查询和保存数据。
在项目根目录下创建一个名为Data的文件夹,并在Data文件夹中创建一个名为AppDbContext.cs的类文件。
在AppDbContext.cs中,将AppDbContext类继承IdentityDbContext类,代码如下。
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
namespace StuInfoManaSys.Data;
public class AppDbContext : IdentityDbContext
{
}
IdentityDbContext位于Microsoft.AspNetCore.Identity.EntityFrameworkCore命名空间下,因此要通过using关键字引入此命名空间。
为了在数据库中创建数据表,我们需要将前面创建的模型引入到数据库上下文中,代码如下:
public class AppDbContext : IdentityDbContext
{
public DbSet<Major> Majors { get; set; }
public DbSet<Grade> Grades { get; set; }
public DbSet<Class> Classes { get; set; }
public DbSet<Student> Students { get; set; }
}
学校里每个学生的学号应该是唯一的,因此需要给学生模型的学号属性添加唯一索引,这样当插入已有的值作为学号时会抛出异常。
因此需要重写OnModelCreating方法,代码如下:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Student>()
.HasIndex(s => s.Number)
.IsUnique();
}
可以通过重写OnConfiguring方法将数据文件存储在Data文件夹中,代码如下:
protected override void OnConfiguring(DbContextOptionsBuilder options)
{
options.UseSqlite("FileName=Data/App.db");
}
这段代码表示项目会使用Sqlite作为数据库,并读取存储在Data文件夹下的App.db作为数据文件。
重要事项
按Crtl+Shift+S保存代码,下面创建数据库表
在当前项目文件夹中打开终端。
输入以下命令并回车:
dotnet ef migrations add InitialCreate
上述命令将创建一个名为InitialCreate的迁移,它将根据模型类创建数据库表。
如果终端中显示以下信息,则说明迁移成功。
Build started...
Build succeeded.
Done. To undo this action, use 'ef migrations remove'
此时项目中会多出一个名为Migrations的文件夹,里面包含了如何创建数据库表的详细代码。
然后运行一下命令并回车:
dotnet ef database update
上述命令将应用迁移并创建数据库。如果数据库已存在,它将更新数据库。
如果终端中显示以下信息,则说明迁移成功。
Build started...
Build succeeded.
Applying migration '20240816132735_InitialCreate'.
Done.
此时Data文件夹中会多出一个名为App.db的文件。
可以使用Navicat打开App.db查看数据库表。
可以看到,EF Core会根据创建的模型中的属性自动创建数据库表,并根据属性类型设置字段类型。
在学生表中,Guid类型的Id、DateTime类型的Birthday,以及其他string类型的属性在Sqlite中均变成Text文本类型。