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

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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 10:13:12