c# - “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:“数据类型不匹配”。
重现步骤:
- 下载测试项目(带有一些数据的测试数据库test.db已经放在程序输出文件夹中)。
- 编译并运行测试控制台应用程序 -
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
更多技术细节
- 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 重建不是灵丹妙药,而且工作方式与我预期的略有不同。如果要更改列的数据类型,您应该手动编写所有迁移 -检查与 EF 团队的完整讨论。
推荐阅读
- chatbot - 聊天机器人 IBM WATSON 在 MSN 中获取 facebook 名称
- php - 列为空时不匹配
- mysql - MySQL Workbench 报告 ERROR 1822: Failed to add the foreign key constraint。缺少约束索引
- python - 如何使用 matplot lib 绘制日期与时间的大型数据集
- javascript - Bootstrap Modal 没有正确淡入
- javascript - Vuetify 密码验证包括特殊字符、大写字母、数字和最小长度 6 个字符
- c - 给出奇怪行为的 C 结构数组
- oracle - 需要修复动态向表中插入值的过程
- c - 根据字符串的字符大小与整个字符串的大小为字符串分配内存空间之间的差异
- python - 使用 pandas_profiling profile_report 时出现 MemoryError