首页 > 解决方案 > “SQLite 错误 20:'数据类型不匹配'。'”在 .NET 5.0-preview7 项目中使用 SQLite 表重建执行迁移时出错

问题描述

我有一个带有EF Core 5.0-rc1 DbContext的简单类库项目,它以.NET 5.0-preview7为目标,具有以下实体:

public class User
    {
        public Guid Id { get; set; }
        public String Name { get; set; }
        public Int32 Age { get; set; }

        public virtual IList<Post> Posts { get; set; }
    }

    public class Post
    {
        public Guid Id { get; set; }
        public String Text { get; set; }
        public DateTime PostDate { get; set; }
        public Guid UserId { get; set; }
        public virtual User User { get; set; }
    }

然后我通过dotnet ef migrations add InitialCreate命令添加了第一个迁移,创建了测试数据库并填充了一些数据。之后,我将Post.Id数据类型从Guid更改为Int32并创建了第二次迁移。

根据这个SQLite 迁移表重建现在可以从EF Core 5.0.0-preview8 开始。同样根据文档 AlterColumn命令应该通过表重建为 SQLite 工作。

但是运行context.Database.Migrate();会抛出异常

SQLite 错误 20:“数据类型不匹配”。

重现步骤:

  1. 下载测试项目(带有一些数据的测试数据库test.db已经放在程序输出文件夹中)。
  2. 编译并运行测试控制台应用程序 -context.Database.Migrate();引发异常

异常堆栈跟踪:

在 Microsoft.Data.Sqlite.SqliteException.ThrowExceptionForRC(Int32 rc, sqlite3 db) 在 Microsoft.Data.Sqlite.SqliteDataReader.NextResult() 在 Microsoft.Data.Sqlite.SqliteCommand.ExecuteReader(CommandBehavior 行为) 在 Microsoft.Data.Sqlite。 SqliteCommand.ExecuteReader()
在 Microsoft.EntityFrameworkCore.Migrations.MigrationCommand.ExecuteNonQuery(IRelationalConnection connection, IReadOnlyDictionary' 2 parameterValues) 在 Microsoft.EntityFrameworkCore.Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteNonQuery(RelationalCommandParameterObject parameterObject) 在 Microsoft.Data.Sqlite.SqliteCommand.ExecuteNonQuery()。 Migrations.Internal.MigrationCommandExecutor.ExecuteNonQuery(IEnumerable`1 migrationCommands, IRelationalConnection connection) 在 Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(String targetMigration) 在 Microsoft.EntityFrameworkCore.RelationalDatabaseFacadeExtensions.Migrate(DatabaseFacade databaseFacade) 在 Test.Program.Main (String[] args) 在 D:\Test\Test\Program.cs:line 14

更多技术细节

  1. EF 核心版本:5.0-rc1
  2. 数据库提供者:Microsoft.EntityFrameworkCore.Sqlite 5.0-rc1
  3. 目标框架:.NET 5.0-preview7
  4. 操作系统:Windows 10 2004 x64
  5. IDE:Visual Studio 2019 16.7.3 专业版

标签: c#entity-frameworksqliteentity-framework-coreentity-framework-migrations

解决方案


看起来 SQLite teble 重建不是灵丹妙药,而且工作方式与我预期的略有不同。如果要更改列的数据类型,您应该手动编写所有迁移 -检查与 EF 团队的完整讨论


推荐阅读