"SQLite Error 20: 'datatype mismatch'.'" 使用 SQLite 执行迁移时出错 table 在 .NET 5.0-preview7 项目中重建

"SQLite Error 20: 'datatype mismatch'.'" error while peforming migration with SQLite table rebuild in .NET 5.0-preview7 project

我有一个简单的 class 库项目,其中包含 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 并创建了第二个迁移。

根据 this SQLite 迁移 table 自 EF Core 5.0.0-preview8[=62= 以来重建现在可用]. 同样根据 docs AlterColumn 命令应该通过 table 重建适用于 SQLite。

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

SQLite Error 20: 'datatype mismatch'.'

重现步骤:

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

异常 StackTrace:

at Microsoft.Data.Sqlite.SqliteException.ThrowExceptionForRC(Int32 rc, sqlite3 db) at Microsoft.Data.Sqlite.SqliteDataReader.NextResult() at Microsoft.Data.Sqlite.SqliteCommand.ExecuteReader(CommandBehavior behavior) at Microsoft.Data.Sqlite.SqliteCommand.ExecuteReader()
at Microsoft.Data.Sqlite.SqliteCommand.ExecuteNonQuery() at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteNonQuery(RelationalCommandParameterObject parameterObject) at Microsoft.EntityFrameworkCore.Migrations.MigrationCommand.ExecuteNonQuery(IRelationalConnection connection, IReadOnlyDictionary' 2 parameterValues) at Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationCommandExecutor.ExecuteNonQuery(IEnumerable`1 migrationCommands, IRelationalConnection connection) at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(String targetMigration) at Microsoft.EntityFrameworkCore.RelationalDatabaseFacadeExtensions.Migrate(DatabaseFacade databaseFacade) at Test.Program.Main(String[] args) in 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 专业版

看起来 SQLite teble 重建并不是灵丹妙药,而且工作方式与我预期的略有不同。如果更改列的数据类型,您应该手动编写所有迁移 - check full discussion with EF team.