数据库上下文

通过数据库上下文可以配置实体和数据库表之间的映射关系,并且可以查询和保存数据。

创建AppDbContext

在项目根目录下创建一个名为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关键字引入此命名空间。

设置DbSet

为了在数据库中创建数据表,我们需要将前面创建的模型引入到数据库上下文中,代码如下:

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查看数据库表。

image-20240816213900982

可以看到,EF Core会根据创建的模型中的属性自动创建数据库表,并根据属性类型设置字段类型。

在学生表中,Guid类型的Id、DateTime类型的Birthday,以及其他string类型的属性在Sqlite中均变成Text文本类型。