ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

EF Core SQLite 数据库提供程序:UseSqlite 选型、连接串参数与 DI 服务模型源码解析

EF Core SQLite 数据库提供程序:UseSqlite 选型、连接串参数与 DI 服务模型源码解析 EF Core SQLite 数据库提供程序UseSqlite 选型、连接串参数与 DI 服务模型源码解析【免费下载链接】efcoreEF Core is a modern object-database mapper for .NET. It supports LINQ queries, change tracking, updates, and schema migrations.项目地址: https://gitcode.com/GitHub_Trending/ef/efcore本文围绕 EF Core 仓库中Microsoft.EntityFrameworkCore.Sqlite包src/EFCore.Sqlite/README.md展开讲解如何在该 ORM 中启用 SQLite 提供程序、UseSqlite的完整重载体系、连接串各关键字的默认值与行为差异以及该提供程序在依赖注入容器中的服务注册模型。读完后你可以独立配置 SQLite 连接、理解连接池/同步模式等关键参数并能从源码层面确认这些配置的落地位置。一、Microsoft.EntityFrameworkCore.Sqlite 是什么按 src/EFCore.Sqlite/README.md 的定义Microsoft.EntityFrameworkCore.Sqlite是 EF Core 面向 SQLite 的数据库提供程序包database provider package。它本身是一个纯打包工程packaging project从 src/EFCore.Sqlite/EFCore.Sqlite.csproj 可以看到三个关键事实通过ProjectReference引用..\EFCore.Sqlite.Core\EFCore.Sqlite.Core.csproj即 src/EFCore.Sqlite.Core/EFCore.Sqlite.Core.csproj提供程序的全部代码模型约定、SQL 生成、查询翻译、迁移、脚手架都在 Core 包中实现通过PackageReference引入SQLitePCLRaw.bundle_e_sqlite3即 SQLite 原生二进制随包自动分发——这是它与 Core 包最本质的区别Target NameCompile /与Target NameCopyFilesToOutputDirectory /被显式置空说明该工程不产生任何托管程序集仅负责把 Core 包与原生二进制组合成一个 NuGet 包。因此对绝大多数应用而言直接安装Microsoft.EntityFrameworkCore.Sqlite即可无需关心原生库的加载细节。只有当应用需要替换为其他 SQLite 原生二进制时才改用 src/EFCore.Sqlite.Core/README.md 描述的 Core 包自行安装一个 SQLitePCLRaw 二进制包并调用SQLitePCL.Batteries_V2.Init();初始化之后UseSqlite的用法完全一致。二、启用 SQLite 提供程序UseSqlite 的完整重载体系原 README 给出的最小用法是protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlite(Data Sourcedatabase.db); }调用UseSqlite即为DbContext选定 SQLite 提供程序。从源码 src/EFCore.Sqlite.Core/Extensions/SqliteDbContextOptionsBuilderExtensions.cs 看非泛型DbContextOptionsBuilder上共有 4 个核心重载各自对应一种连接来源策略重载签名连接来源典型场景UseSqlite(ActionSqliteDbContextOptionsBuilder?)暂不设置连接串/连接延后通过Database.SetConnectionString/SetDbConnection动态指定UseSqlite(string? connectionString, ActionSqliteDbContextOptionsBuilder?)连接字符串最常见如Data Sourcedatabase.dbUseSqlite(DbConnection connection, ActionSqliteDbContextOptionsBuilder?)现有DbConnection复用调用方持有的连接UseSqlite(DbConnection connection, bool contextOwnsConnection, ActionSqliteDbContextOptionsBuilder?)现有DbConnection 所有权控制需要 EF 代为释放连接时传true几个值得注意的行为细节均见于该文件 XML 文档注释与实现连接所有权规则当传入已打开的连接时EF 不负责打开/关闭连接处于关闭状态时EF 会按需打开与关闭contextOwnsConnection为true时 EF 会像处理自建连接一样释放它否则释放责任仍在调用方见 SqliteDbContextOptionsBuilderExtensions.cs 的contextOwnsConnection参数注释。链式扩展配置每个重载都接受ActionSqliteDbContextOptionsBuilder回调可进一步做 SQLite 特定配置所有重载内部都会执行ConfigureWarnings用RelationalOptionsExtension.WithDefaultWarningConfiguration写入关系型提供程序的默认警告配置见 同文件。泛型版本UseSqliteTContext同文件只是对非泛型版本的转发DbContextOptionsBuilderTContext场景下行为一致。三、连接串深度解析SqliteConnectionStringBuilder 的全部关键字UseSqlite(Data Sourcedatabase.db)中传入的字符串由 src/Microsoft.Data.Sqlite.Core/SqliteConnectionStringBuilder.cs 解析。该类继承DbConnectionStringBuilder在静态构造函数中注册了 10 个有效关键字及 3 个别名同文件。完整参数表如下默认值取自源码中的字段初始化与Reset方法关键字别名属性类型默认值行为说明Data SourceFilename、DataSourcestring空字符串数据库文件路径Mode-SqliteOpenModeReadWriteCreate连接模式ReadWriteCreate可读写不存在则创建、ReadWrite可读写、ReadOnly只读、Memory内存库Cache-SqliteCacheModeDefault缓存模式Default、Private每连接独立缓存、Shared连接共享缓存可能改变事务与表锁定行为Password-string空字符串加密密钥指定后打开连接时立即发送PRAGMA key。若原生库不支持加密则无效Foreign Keys-bool?nulltrue时打开后立即发送PRAGMA foreign_keys 1false发送 0null时不发送任何 pragma若原生库按SQLITE_DEFAULT_FOREIGN_KEYS编译则无需显式开启Recursive Triggers-boolfalsetrue时打开后立即发送PRAGMA recursive_triggersfalse时不发送Default TimeoutCommand Timeoutint30默认SqliteConnection.DefaultTimeout秒Pooling-booltrue是否对连接进行池化Vfs-string?null指定连接使用的 SQLite VFSSynchronous-SqliteSynchronousModenull同步模式Off、Normal、Full、Extranull时不发送 synchronous pragma使用SqliteConnectionStringBuilder以类型安全方式构造连接串等价于var builder new SqliteConnectionStringBuilder(Data Sourcedatabase.db); builder.ForeignKeys true; // 打开连接后立即发送 PRAGMA foreign_keys 1 builder.Synchronous SqliteSynchronousMode.Normal; builder.Pooling true; // 默认即为 true两点源码层面的细节三值外键语义ForeignKeys是bool?null与false的语义不同前者不发送 pragma后者显式禁用这在解析层由ConvertToNullableBoolean专门处理空字符串映射为null见 SqliteConnectionStringBuilder.cs。别名机制Filename与DataSource都映射到Data SourceCommand Timeout映射到Default Timeout访问未注册的关键字会抛出ArgumentExceptionResources.KeywordNotSupported见 同文件。四、依赖注入场景AddSqlite 与提供程序服务注册在 ASP.NET Core 等使用 DI 的应用中src/EFCore.Sqlite.Core/Extensions/SqliteServiceCollectionExtensions.cs 提供了一行式注册services.AddSqliteAppDbContext( Data Sourcedatabase.db, sqliteOptionsAction: null, optionsAction: null);该方法的 XML 注释明确说明它只是AddDbContext的快捷方式不支持全部选项需要完全控制时应直接使用AddDbContext再在回调中调用UseSqlite。同一文件中的AddEntityFrameworkSqliteSqliteServiceCollectionExtensions.cs展示了 SQLite 提供程序注入内部服务容器的完整清单从源码结构看其覆盖四大能力域元数据/模型SqliteAnnotationProvider、SqliteModelValidator、SqliteConventionSetBuilderSQL 生成与查询翻译SqliteSqlGenerationHelper、SqliteQuerySqlGeneratorFactory、SqliteMethodCallTranslatorProvider、SqliteQueryableMethodTranslatingExpressionVisitorFactory等更新管线SqliteModificationCommandBatchFactory、SqliteModificationCommandFactory、SqliteUpdateSqlGenerator、SqliteParameterBasedSqlProcessorFactory迁移与连接SqliteMigrationsSqlGenerator、SqliteDatabaseCreator、SqliteHistoryRepository、ISqliteRelationalConnectionScoped 注册。其注释同时提醒该方法标有[EditorBrowsable(Never)]普通应用不应直接调用仅在使用UseInternalServiceProvider的高级场景下构建内部服务容器时才需要。五、包选型小结与反馈渠道常规应用安装Microsoft.EntityFrameworkCore.Sqlite调用UseSqlite原生 SQLite 二进制由SQLitePCLRaw.bundle_e_sqlite3自动携带见 src/EFCore.Sqlite/EFCore.Sqlite.csproj需要替换原生二进制或嵌入自定义 SQLite 构建改用 src/EFCore.Sqlite.Core 包自行安装 SQLitePCLRaw 二进制包并调用SQLitePCL.Batteries_V2.Init();初始化底层的 ADO.NET 提供程序由 src/Microsoft.Data.Sqlite/Microsoft.Data.Sqlite.csproj 打包常用类型包括SqliteConnection、SqliteCommand、SqliteConnectionStringBuilder、SqliteDataReader、SqliteParameter、SqliteTransaction等。若在包中发现 bug 或问题仓库支持渠道见 .github/SUPPORT.md可按其指引提交 issue。参考文件src/EFCore.Sqlite/README.md — 包定位与最小用法src/EFCore.Sqlite/EFCore.Sqlite.csproj — 打包工程结构src/EFCore.Sqlite.Core/README.md — Core 包与原生二进制说明src/EFCore.Sqlite.Core/Extensions/SqliteDbContextOptionsBuilderExtensions.cs —UseSqlite全部重载src/EFCore.Sqlite.Core/Extensions/SqliteServiceCollectionExtensions.cs —AddSqlite与服务注册src/Microsoft.Data.Sqlite.Core/SqliteConnectionStringBuilder.cs — 连接串关键字与默认值【免费下载链接】efcoreEF Core is a modern object-database mapper for .NET. It supports LINQ queries, change tracking, updates, and schema migrations.项目地址: https://gitcode.com/GitHub_Trending/ef/efcore创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进