.Net基础系列(五):初始化数据库中表的数据

问题

如何在.Net项目中初始化数据库的数据?

前置条件

  • 基于.Net 6.0创建的C# Demo
  • 主要目录结构如下
txt 复制代码
DemoApplication
    |---> src
           |---> db
                  |---> DataSeeder.cs
                  |---> SqlDbContext.cs
                  |---> configuration folder
                          |---> BooksEntityConfiguration.cs
           |---> Migrations folder
           |---> Program.cs

通过代码生成数据库表

0. 类之间的依赖关系

flowchart LR A0[Books实体类] --> |被使用| M0[BooksEntityConfiguration.cs] M0 -->|被使用 | A1[SqlDbContext] A1 -->|被使用 | M2[Program.cs]

1. 生成实体Books类的配置文件

创建BooksEntityConfiguration.cs类,继承IEntityTypeConfiguration,参数是Books类。

然后在Configure方法里配置Books数据表的额外属性,如Key是哪个字段,哪个字段什么样是否必须等。 注意这里 ,配置是可以跳过的,那么程序就会按照Books类的定义生成数据表的结构。

C# 复制代码
// BooksEntityConfiguration.cs
public class BooksEntityConfiguration : IEntityTypeConfiguration<Books>
{
    public void Configure(EntityTypeBuilder<Books> builder)
    {
        builder.HasKey(b => b.Id);
        
        builder.Property(b => b.Id).HasDefaultValueSql("NEWID()");
        builder.Property(b => b.Name).IsRequired();
        builder.Property(b => b.AuthorId).IsRequired();
        builder.Property(b => b.CreatedBy).HasColumnType("date");

        builder.HasIndex(b => b.Name).IsUnique();
    }
}

2. 应用Books类的配置

定义SqlDbContext.cs类,继承DbContext,在OnModelCreating方法中应用前面定义的关于Books的配置。

C# 复制代码
// SqlDbContext.cs
public class SqlDbContext : DbContext
{
    public DbSet<Books> Books { get; set; }

    public SqlDbContext(DbContextOptions options) : base(options)
    {
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.ApplyConfiguration(new BooksEntityConfiguration());
    }
}

3. 安装并使用dotnet命令生成Migrations文件

  • 安装dotnet工具
sh 复制代码
dotnet tool install --global dotnet-ef
  • 使用dotnet-ef命令,根据配置文件在Migrations目录下生成要迁移的数据文件.
sh 复制代码
dotnet ef migrations add Books --project Demo/Demo.csproj
dotnet ef database update -p Demo/Demo.csproj

4. 基于Migrations文件创建数据库的表

Program.cs 获取到DB的实例,然后执行Migrate方法,执行上一步生成的Migrations文件,在数据库生成需要的数据表。

C# 复制代码
// Program.cs
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

using (var scope = app.Services.CreateScope())
{
    var services = scope.ServiceProvider;
    var db = services.GetService<SqlDbContext>();
    // 这里
    db.Database.Migrate();
}

初始化数据

0. 类之间的依赖关系

flowchart LR M1[Program.cs] --> |调用|A[Migrate] M1 --> |调用| B[Seed] B --> |调用| B1[DataSeeder]

1. 初始化Books数据

DataSeeder.cs静态类中,配置books列表,然后将这些数据更新到数据库的表中,也可以指定哪些字段不需要更新。

C# 复制代码
// DataSeeder.cs
public static class DataSeeder
{
    public static void SeedData(this SqlDbContext db)
    {
        SeedBooks(db);
    }

    private static void SeedBooks(SqlDbContext db)
    {
        var books = new List<Books>
        {
            new Books { Name = "悉达多", Type = "文学"}
        };

        db.BulkInsertOrUpdate(books, options =>
        {
            options.UpdateByProperties = new List<string> { nameof(Books.Name) };
            options.PropertiesToExcludeOnUpdate = new List<string> { nameof(Books.Id) };
        });
    }

2. 执行

Program.cs 获取到DB的实例,然后在项目开始的时候,初始化数据库中表的数据。这部分由SeedData方法来实现。

C# 复制代码
// Program.cs
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

using (var scope = app.Services.CreateScope())
{
    var services = scope.ServiceProvider;
    var db = services.GetService<SqlDbContext>();
    db.Database.Migrate();
    // 这里
    db.SeedData();
}
相关推荐
玩泥巴的1 小时前
.NET驾驭Word之力:基于规则自动生成及排版Word文档
c#·word·.net·com互操作
专注VB编程开发20年1 小时前
VB.NET多线程排序算法实现:LINQ与正则表达式方法
排序算法·.net·linq
SunnyDays10112 小时前
C# 实现高保真 Excel 转 PDF(无需 Office 环境)
经验分享·c#·excel转pdf
攻城狮CSU2 小时前
C# 数据加载专题 之泛型序列化
java·servlet·c#
爱编程的鱼2 小时前
C# 参数详解:从基础传参到高级应用
开发语言·microsoft·c#
流水线上的指令侠4 小时前
使用C#写微信小程序后端——电商微信小程序
微信小程序·小程序·c#·visual studio
gc_22995 小时前
C#编写的WebApi接口直接返回byte数组引发的问题
c#·byte数组
EQ-雪梨蛋花汤6 小时前
【踩坑记录】从“正在还原所需的工具包”说起:一次 .NET 工程包还原失败的完整排查实录
.net
喵叔哟8 小时前
63.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--新增功能--预算告警
运维·微服务·.net
专注VB编程开发20年8 小时前
VB.NET2003和VB2008可以导入VB6项目
.net·vb.net·vb6·vb2008