如何在LinqToDB中使用多个SQLite数据库?
我之前在WPF项目里用LinqToDB操作多个SQLite数据库时也碰到过一模一样的问题,当时折腾了好一阵才搞清楚根源,给你分享几个靠谱的解决方案:
核心问题分析
LinqToDB在没有明确指定连接串的情况下,会默认选取配置文件中第一个匹配Provider的连接串,这就是为什么你调整顺序后只能访问当前第一个数据库的原因——你的数据上下文实例化时没指定要用哪个连接串,它自动选了第一个SQLite的。
具体解决方案
1. 实例化上下文时明确指定连接串名称
不管你是用T4模板生成的上下文类,还是自己写的,LinqToDB的DataConnection派生类都会提供带连接串名称的构造函数。比如针对你的两个数据库:
// 访问AddonManager数据库 using var managerDb = new AddonManagerDB("AddonManager"); // 访问AddonDb数据库 using var addonDb = new AddonDbDB("AddonDb");
这样就能强制LinqToDB加载对应名称的连接串,不会再搞混。
2. 直接传入连接字符串(适合动态路径场景)
如果你的数据库路径是动态的(比如用户自定义路径),可以直接把连接字符串传给上下文构造函数,完全绕开配置文件的匹配逻辑:
// 构造AddonDb的连接字符串 var addonDbConnStr = "Data Source=AddonDb.sqlite3"; // 指定Provider为SQLite using var addonDb = new AddonDbDB(addonDbConnStr, ProviderName.SQLite);
3. 确保T4模板生成的上下文关联正确连接串
如果你是用LinqToDB的T4模板生成数据上下文,一定要在模板里设置ConnectionName参数,让生成的代码默认使用指定的连接串:
在T4模板文件开头添加或修改这个参数:
<#@ parameter name="ConnectionName" type="System.String" value="AddonDb" #>
重新生成后,上下文的无参构造函数会默认使用这个连接名,避免每次实例化都要手动传参。
4. 检查配置文件的正确性
最后再确认下你的app.config结构是否正确,连接串必须放在<connectionStrings>节点下,providerName要和LinqToDB识别的一致(这里用SQLite是没问题的):
<configuration> <connectionStrings> <add name="AddonManager" connectionString="Data Source=AddonManager.sqlite3" providerName="SQLite" /> <add name="AddonDb" connectionString="Data Source=AddonDb.sqlite3" providerName="SQLite" /> </connectionStrings> </configuration>
总结
本质上就是不要依赖LinqToDB的自动连接串匹配,手动指定每个上下文对应的连接信息,这样两个数据库就能独立访问,不会再出现互相覆盖的问题。
内容的提问来源于stack exchange,提问作者Kenny Mann

