EF 6搭配SQLite Code First无法创建数据库问题求助
EF6 + SQLite Code First 问题排查方案
1. 先确认SQLite EF6驱动装对了
得用专门适配EF6的System.Data.SQLite.EF6 NuGet包,别装成只支持ADO.NET的普通SQLite包,版本要和.NET 4.x匹配,项目里得确实装上这个包。
2. 检查App.config配置有没有错
这是最容易踩坑的地方,几个关键节点不能少:
- DbProviderFactories:得注册SQLite的EF6提供程序,还要先移除可能存在的旧注册
- entityFramework:指定SQLite为EF的提供程序之一
- connectionStrings:连接字符串里的
providerName必须是System.Data.SQLite.EF6,不能写错成System.Data.SQLite
给你个正确的配置片段参考:
<configuration> <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" /> </DbProviderFactories> </system.data> <entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> <parameters> <parameter value="mssqllocaldb" /> </parameters> </defaultConnectionFactory> <providers> <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" /> <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> </providers> </entityFramework> <connectionStrings> <add name="BlogContext" connectionString="Data Source=pemo.db3;Version=3;" providerName="System.Data.SQLite.EF6" /> </connectionStrings> </configuration>
3. 你的DbContext和实体类配置对了吗?
- DbContext的构造函数得指定连接字符串的名称,比如
SUPER("name=BlogContext") - 实体的主键必须明确标记,比如用
AUTOINC或者[Key]特性,EF没主键的话不会生成表结构
给个X#的示例:
CLASS BlogContext INHERITS DbContext CONSTRUCTOR() SUPER("name=BlogContext") END CONSTRUCTOR PROPERTY Blogs AS DbSet<Blog> READONLY END CLASS CLASS Blog PROPERTY BlogId AS INT AUTOINC // 这里必须是主键 PROPERTY Name AS STRING END CLASS
4. 得手动触发数据库初始化
EF6 Code First默认不会自动给你建表,你得在程序启动的时候加一段代码强制初始化:
USING System.Data.Entity // 如果数据库不存在就创建,同时生成表结构 DbDatabase.SetInitializer<BlogContext>(new CreateDatabaseIfNotExists<BlogContext>()) // 要是需要迁移的话就用下面这个,不过得先开迁移 // DbDatabase.SetInitializer<BlogContext>(new MigrateDatabaseToLatestVersion<BlogContext, YourMigrationConfig>())
5. 关于迁移的小提示
要是之前搞过迁移但没成功,可能堵着了。可以试试在Package Manager Console里执行:Enable-Migrations → Add-Migration InitialCreate → Update-Database
不过X#项目执行这些命令的时候,得确保工具能识别X#代码,实在不行就手动写迁移类。
为啥__MigrationHistory表不存在是关键?
你觉得这个表不影响,但实际上EF6 Code First建库的时候会自动生成它,日志里说不存在,说明EF根本没触发建表的逻辑——这直接指向你的配置或者初始化策略有问题,不是EF不支持SQLite Code First(EF6完全支持)。
内容的提问来源于stack exchange,提问作者Peter M.
相关产品推荐
相关产品推荐

