dotnetcore / dotnetcore/FreeSql
建议增加在创建 SQLiteConnection 时按需加载原生扩展,如 mod_spatialite
- Dominant language
- C#
- Stars
- 4.4k
- Forks
- 910
- PR merge metrics
- No merged PRs in 30d
Description
#### Feature 特性
建议在 `FreeSqlBuilder` 中增加 `UseLoadExtension` 方法,允许在构建 `IFreeSql` 实例时,配置 SQLite 连接需要加载的原生扩展库。
期望的 API 调用方式如下:
```c#
var orm = new FreeSqlBuilder()
.UseConnectionString(DataType.Sqlite, connectionString)
// 新增配置:支持传入扩展路径,或根据 OS 自动推断文件名
.UseLoadExtension("mod_spatialite")
// 或者支持更复杂的配置
// .UseLoadExtension(new[] { "mod_spatialite", "other_extension" })
.UseAutoSyncStructure(false)
.UseMonitorCommand(cmd =>
{
cmd.CommandTimeout = 0;
LogHelper.Trace(cmd.CommandText);
}, (cmd, text) => { LogHelper.Trace(text); })
.Build();
```
#### 简要描述原因
目前 FreeSql 创建 SQLite 连接时,无法自动加载原生扩展(如 `mod_spatialite`)。
虽然可以通过 AOP(`ConfigureConnection`)事件在连接打开后手动加载,但这需要编写重复的样板代码。如果能在构建器层面直接支持扩展加载,将更加优雅且易于复用。
**当前痛点:**
必须手动拦截连接创建过程来启用和加载扩展,代码侵入性强。
参考目前的实现方式:
```c#
private static SQLiteConnection OpenConnection(string path)
{
var conn = new SQLiteConnection($"Data Source={path};Version=3;");
conn.Open();
conn.EnableExtensions(true);
try
{
conn.LoadExtension("mod_spatialite");
}
catch (Exception ex)
{
throw new InvalidOperationException(
"加载 mod_spatialite 原生扩展失败,请确认运行时可加载 mod_spatialite(Windows: mod_spatialite.dll / Linux: libmod_spatialite.so)。", ex);
}
return conn;
}
```
#### 使用场景
1. **GIS 地理信息系统开发**:这是最主要的使用场景。开发者需要使用 SQLite 的 `mod_spatialite` 扩展来支持空间数据存储和空间函数查询(如 `ST_Distance`、`ST_Contains` 等)。
2. **自定义加密或压缩**:使用了自定义编译的 SQLite 扩展来进行数据库层面的加密或压缩处理。
3. **跨平台兼容性**:希望 FreeSql 能根据运行环境(Windows / Linux / macOS)自动处理扩展库的后缀名(`.dll` / `.so` / `.dylib`),简化部署配置。
---
Contributor guide
No contributing guide indexed for this repository
Research direction
Start with FreeSqlBuilder and the SQLite connection creation path, using the existing ConfigureConnection approach as the reference behavior. Define how configured extension paths are applied across Windows, Linux, and macOS, then verify that extensions load during construction and that failures remain actionable.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- csharp, sqlite
- Domain
- databases
- Issue type
- Feature
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 55/100