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的数据库初始化触发时机,会导致初始化时连接参数未正确绑定。
修复方案
- 修正连接字符串格式,移除密码参数的单引号:
public MyDbContext() : base(new SQLiteConnection(@"Data Source=|DataDirectory|Data.db;Password=abcdef;"), true) { Configuration.LazyLoadingEnabled = false; }
- 清理
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); } }
- 调整数据库初始化器的注册位置,移到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); }
- 检查
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
相关产品推荐
相关产品推荐

