You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EF6使用SQLite Code First迁移时抛出bad parameter API misuse异常

异常触发原因
  • 连接字符串参数格式错误:System.Data.SQLite的Password连接参数不需要包裹单引号,你代码中书写的Password='abcdef'额外携带的单引号会导致数据库驱动识别参数异常,触发API调用错误。
  • 数据库提供程序配置冲突:SQLiteConfiguration类中同时注册了SQL Server和SQLite两类提供程序,且将默认连接工厂设置为SQL Server的SqlConnectionFactory,EF初始化时提供程序匹配逻辑混乱,导致调用SQLite连接时出现参数不匹配问题。
  • 数据库初始化器注册位置错误:在OnModelCreating方法中注册SqliteCreateDatabaseIfNotExists初始化器的时机晚于EF的数据库初始化触发时机,会导致初始化时连接参数未正确绑定。
修复方案
  1. 修正连接字符串格式,移除密码参数的单引号:
public MyDbContext()
    : base(new SQLiteConnection(@"Data Source=|DataDirectory|Data.db;Password=abcdef;"), true)
{
    Configuration.LazyLoadingEnabled = false;
}
  1. 清理SQLiteConfiguration配置,删除SQL Server相关的注册项,修正默认连接工厂配置:
public class SQLiteConfiguration : DbConfiguration
{
    public SQLiteConfiguration() : base()
    {
        SetDefaultConnectionFactory(new System.Data.Entity.Infrastructure.LocalDbConnectionFactory("v11.0"));
        SetProviderFactory("System.Data.SQLite", SQLiteFactory.Instance);
        SetProviderServices("System.Data.SQLite", (DbProviderServices)SQLiteProviderFactory.Instance.GetService(typeof(DbProviderServices)));
        SetProviderFactory("System.Data.SQLite.EF6", SQLiteProviderFactory.Instance);
    }
}
  1. 调整数据库初始化器的注册位置,移到DbContext构造函数或者程序启动入口(如App.xaml.cs的OnStartup方法):
public MyDbContext()
    : base(new SQLiteConnection(@"Data Source=|DataDirectory|Data.db;Password=abcdef;"), true)
{
    Configuration.LazyLoadingEnabled = false;
    // 此处注册初始化器
    var sqliteConnectionInitializer = new SqliteCreateDatabaseIfNotExists<MyDbContext>(modelBuilder);
    Database.SetInitializer(sqliteConnectionInitializer);
}
  1. 检查App.config配置,确保没有残留的旧数据库提供程序注册,SQLite相关配置参考如下:
<system.data>
  <DbProviderFactories>
    <remove invariant="System.Data.SQLite.EF6" />
    <add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6" />
    <remove invariant="System.Data.SQLite" />
    <add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".NET Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
  </DbProviderFactories>
</system.data>
<entityFramework>
  <providers>
    <provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
  </providers>
</entityFramework>

内容的提问来源于stack exchange,提问作者Neil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 19:54:03