"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'.'
重现步骤:
- 下载test project(测试数据库test.db有一些数据
已放在程序输出文件夹中)。
- 编译并 运行 测试控制台应用程序 -
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
更多技术细节
- EF核心版本:5.0-rc1
- 数据库提供者:Microsoft.EntityFrameworkCore.Sqlite 5.0-rc1
- 目标框架:.NET 5.0-preview7
- 操作系统:Windows 10 2004 x64
- IDE: Visual Studio 2019 16.7.3 专业版
看起来 SQLite teble 重建并不是灵丹妙药,而且工作方式与我预期的略有不同。如果更改列的数据类型,您应该手动编写所有迁移 - check full discussion with EF team.
我有一个简单的 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'.'
重现步骤:
- 下载test project(测试数据库test.db有一些数据 已放在程序输出文件夹中)。
- 编译并 运行 测试控制台应用程序 -
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
更多技术细节
- EF核心版本:5.0-rc1
- 数据库提供者:Microsoft.EntityFrameworkCore.Sqlite 5.0-rc1
- 目标框架:.NET 5.0-preview7
- 操作系统:Windows 10 2004 x64
- IDE: Visual Studio 2019 16.7.3 专业版
看起来 SQLite teble 重建并不是灵丹妙药,而且工作方式与我预期的略有不同。如果更改列的数据类型,您应该手动编写所有迁移 - check full discussion with EF team.