H.Test.Sqlite 教程:从零开始学习 SQLite 数据库集成

一、项目概述

H.Test.Sqlite 是一个演示项目,用于展示如何在 WPF 应用中集成 SQLite 数据库。该项目使用 Entity Framework Core 进行数据访问,并演示了数据库迁移、上下文配置等核心功能。

项目结构

H.Test.Sqlite/
├── Migrations/                  # EF Core 迁移文件
│     ├── 20231101115422_init.Designer.cs
│     ├── 20231101115422_init.cs
│     └── MyDataContextModelSnapshot.cs
├── App.xaml                     # 应用程序入口
├── App.xaml.cs
├── AssemblyInfo.cs
├── H.Test.Sqlite.csproj         # 项目文件
├── MainWindow.xaml              # 主窗口
├── MainWindow.xaml.cs
└── MyDataContext.cs             # 数据库上下文

核心依赖

依赖项目 作用
H.DataBases.Sqlite SQLite 数据库支持
Microsoft.EntityFrameworkCore.Sqlite EF Core SQLite 提供程序
Microsoft.EntityFrameworkCore.Design 设计时支持
Microsoft.EntityFrameworkCore.Proxies 延迟加载代理

二、SQLite 简介

2.1 SQLite 特点

特性 说明
轻量级 嵌入式数据库,无需独立服务器
零配置 开箱即用,无需安装
单文件 整个数据库存储在一个文件中
跨平台 支持 Windows、Linux、macOS
ACID 兼容 支持事务处理

2.2 SQLite 适用场景

  • 桌面应用本地数据存储
  • 移动端应用数据存储
  • 嵌入式设备数据库
  • 开发测试环境

三、数据库上下文配置

3.1 创建 DataContext

using H.DataBases.Share;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;

namespace H.Test.Sqlite
{
    public class MyDataContext : DbContext
    {
        // 构造函数注入配置
        public MyDataContext(DbContextOptions<MyDataContext> options) : base(options)
        {
            // Database.EnsureCreated(); // 自动创建数据库(不使用迁移时)
        }

        // 模型配置
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            // 可以在这里配置实体关系、索引等
        }

        // 定义实体集合
        public DbSet<mbc_dv_image> mbc_dv_images { get; set; }
    }
}

3.2 设计时工厂

public class MyDataContextFactory : IDesignTimeDbContextFactory<MyDataContext>
{
    public MyDataContext CreateDbContext(string[] args)
    {
        var optionsBuilder = new DbContextOptionsBuilder<MyDataContext>();
        // 配置 SQLite 连接字符串
        optionsBuilder.UseLazyLoadingProxies()  // 启用延迟加载
                      .UseSqlite("Data Source=Migration.db");  // SQLite 数据库文件
        
        return new MyDataContext(optionsBuilder.Options);
    }
}

3.3 实体类示例

public class mbc_dv_image
{
    public int Id { get; set; }           // 主键
    public string Name { get; set; }      // 名称
    public string Url { get; set; }       // 地址
    public DateTime CreateTime { get; set; } = DateTime.Now;  // 创建时间
}

四、EF Core 迁移

4.1 创建迁移

打开 Package Manager Console(PMC),执行以下命令:

Add-Migration init -Project H.Test.Sqlite

4.2 应用迁移

Update-Database -Project H.Test.Sqlite

4.3 迁移文件结构

Migrations/
├── 20231101115422_init.cs          # 迁移逻辑
├── 20231101115422_init.Designer.cs # 设计时代码(自动生成)
└── MyDataContextModelSnapshot.cs    # 模型快照

4.4 迁移文件解析

public partial class init : Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        // 创建表
        migrationBuilder.CreateTable(
            name: "mbc_dv_images",
            columns: table => new
            {
                Id = table.Column<int>(nullable: false)
                    .Annotation("Sqlite:Autoincrement", true),
                Name = table.Column<string>(nullable: true),
                Url = table.Column<string>(nullable: true),
                CreateTime = table.Column<DateTime>(nullable: false)
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_mbc_dv_images", x => x.Id);
            });
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        // 回滚:删除表
        migrationBuilder.DropTable(
            name: "mbc_dv_images");
    }
}

五、依赖注入配置

5.1 在 App.xaml.cs 中配置

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);
        
        // 配置依赖注入
        var services = new ServiceCollection();
        
        // 注册数据库上下文
        services.AddDbContext<MyDataContext>(options =>
        {
            options.UseLazyLoadingProxies()
                   .UseSqlite("Data Source=Migration.db");
        });
        
        // 构建服务提供者
        var serviceProvider = services.BuildServiceProvider();
        
        // 设置全局服务提供者
        ServiceLocator.SetProvider(serviceProvider);
    }
}

六、数据操作示例

6.1 查询数据

using (var db = new MyDataContext())
{
    // 查询所有记录
    var images = db.mbc_dv_images.ToList();
    
    // 条件查询
    var filtered = db.mbc_dv_images.Where(x => x.Name.Contains("test")).ToList();
    
    // 分页查询
    var paged = db.mbc_dv_images.Skip(0).Take(10).ToList();
}

6.2 插入数据

using (var db = new MyDataContext())
{
    var image = new mbc_dv_image
    {
        Name = "测试图片",
        Url = "https://example.com/image.jpg",
        CreateTime = DateTime.Now
    };
    
    db.mbc_dv_images.Add(image);
    db.SaveChanges();
}

6.3 更新数据

using (var db = new MyDataContext())
{
    var image = db.mbc_dv_images.FirstOrDefault(x => x.Id == 1);
    if (image != null)
    {
        image.Name = "更新后的名称";
        db.SaveChanges();
    }
}

6.4 删除数据

using (var db = new MyDataContext())
{
    var image = db.mbc_dv_images.FirstOrDefault(x => x.Id == 1);
    if (image != null)
    {
        db.mbc_dv_images.Remove(image);
        db.SaveChanges();
    }
}

七、高级配置

7.1 延迟加载

optionsBuilder.UseLazyLoadingProxies();

7.2 连接字符串配置

// 方式1:直接硬编码
.UseSqlite("Data Source=Migration.db");

// 方式2:从配置文件读取
.UseSqlite(Configuration.GetConnectionString("DefaultConnection"));

// 方式3:使用内存数据库(适合测试)
.UseSqlite("Data Source=:memory:");

7.3 日志配置

optionsBuilder.LogTo(Console.WriteLine, LogLevel.Information);

八、项目运行

8.1 运行方式

  1. 打开解决方案
  2. 右键点击 H.Test.Sqlite 项目
  3. 选择 “设为启动项目”
  4. 按 F5 运行

8.2 验证数据库

运行后会在项目目录下生成 Migration.db 文件,这就是 SQLite 数据库文件。


九、常见问题

9.1 迁移命令找不到

问题:执行 Add-Migration 时提示找不到命令

解决

  1. 确保已安装 Microsoft.EntityFrameworkCore.Tools
  2. 在 PMC 中选择正确的默认项目
  3. 使用完整命令:
Add-Migration init -Project H.Test.Sqlite -StartupProject H.Test.Sqlite

9.2 SQLite 数据库文件位置

问题:数据库文件在哪里?

解决

  • 默认在项目输出目录(bin/Debug/net8.0-windows/)
  • 可以使用绝对路径:Data Source=C:\Data\MyDatabase.db

9.3 延迟加载不生效

问题:关联实体为 null

解决

  1. 确保启用了延迟加载:UseLazyLoadingProxies()
  2. 确保关联属性为 virtual
public virtual ICollection<Child> Children { get; set; }

十、总结

H.Test.Sqlite 展示了 SQLite 数据库集成的完整流程:

  1. 创建 DataContext:继承 DbContext,定义实体集合
  2. 配置连接:使用 SQLite 提供程序
  3. 设计时工厂:支持 EF Core 命令行工具
  4. 迁移管理:创建和应用数据库迁移
  5. 数据操作:CRUD 操作示例

通过本教程,你应该已经掌握了在 WPF 应用中使用 SQLite 的基本方法。SQLite 是桌面应用的理想数据库选择,配合 EF Core 可以快速构建数据驱动的应用。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐