戳戳猫的小窝
更新日志
关于
通过数据库上下文可以配置实体和数据库表之间的映射关系,并且可以查询和保存数据。 # 创建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](https://image.nyazira.top/Article/image-20240816213900982.png) 可以看到,EF Core会根据创建的模型中的属性自动创建数据库表,并根据属性类型设置字段类型。 在学生表中,Guid类型的Id、DateTime类型的Birthday,以及其他string类型的属性在Sqlite中均变成Text文本类型。
数据库上下文